Skip to content

Commit ae98e96

Browse files
committed
Tests
1 parent e6b2fa6 commit ae98e96

File tree

4 files changed

+251
-35
lines changed

4 files changed

+251
-35
lines changed

llvm/test/CodeGen/ARM/popcnt.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ define i32 @ctpop32(i32 %x) nounwind readnone {
329329
ret i32 %count
330330
}
331331

332-
define i32 @ctpop64(i64 %x) nounwind readnone {
332+
define i64 @ctpop64(i64 %x) nounwind readnone {
333333
; CHECK-LABEL: ctpop64:
334334
; CHECK: @ %bb.0:
335335
; CHECK-NEXT: .save {r11, lr}
@@ -338,8 +338,7 @@ define i32 @ctpop64(i64 %x) nounwind readnone {
338338
; CHECK-NEXT: pop {r11, lr}
339339
; CHECK-NEXT: mov pc, lr
340340
%count = tail call i64 @llvm.ctpop.i64(i64 %x)
341-
%conv = trunc i64 %count to i32
342-
ret i32 %conv
341+
ret i64 %count
343342
}
344343

345344
define i32 @ctpop_eq_one(i64 %x) nounwind readnone {

llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ declare i8 @llvm.ctpop.i8(i8)
2828
declare i16 @llvm.ctpop.i16(i16)
2929
declare i32 @llvm.ctpop.i32(i32)
3030
declare i64 @llvm.ctpop.i64(i64)
31+
declare i128 @llvm.ctpop.i128(i128)
3132

3233
define i8 @test_cttz_i8(i8 %a) nounwind {
3334
; RV32_NOZBB-LABEL: test_cttz_i8:
@@ -2094,6 +2095,154 @@ define i64 @test_ctpop_i64(i64 %a) nounwind {
20942095
ret i64 %1
20952096
}
20962097

2098+
define i128 @test_ctpop_i128(i128 %a) nounwind {
2099+
; RV32_NOZBB-LABEL: test_ctpop_i128:
2100+
; RV32_NOZBB: # %bb.0:
2101+
; RV32_NOZBB-NEXT: addi sp, sp, -32
2102+
; RV32_NOZBB-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
2103+
; RV32_NOZBB-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
2104+
; RV32_NOZBB-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
2105+
; RV32_NOZBB-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
2106+
; RV32_NOZBB-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
2107+
; RV32_NOZBB-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
2108+
; RV32_NOZBB-NEXT: lw s0, 0(a1)
2109+
; RV32_NOZBB-NEXT: lw s1, 4(a1)
2110+
; RV32_NOZBB-NEXT: lw a2, 8(a1)
2111+
; RV32_NOZBB-NEXT: lw a1, 12(a1)
2112+
; RV32_NOZBB-NEXT: mv s2, a0
2113+
; RV32_NOZBB-NEXT: mv a0, a2
2114+
; RV32_NOZBB-NEXT: call __popcountdi2
2115+
; RV32_NOZBB-NEXT: mv s3, a0
2116+
; RV32_NOZBB-NEXT: mv s4, a1
2117+
; RV32_NOZBB-NEXT: mv a0, s0
2118+
; RV32_NOZBB-NEXT: mv a1, s1
2119+
; RV32_NOZBB-NEXT: call __popcountdi2
2120+
; RV32_NOZBB-NEXT: add a1, a1, s4
2121+
; RV32_NOZBB-NEXT: add s3, a0, s3
2122+
; RV32_NOZBB-NEXT: sltu a0, s3, a0
2123+
; RV32_NOZBB-NEXT: add a0, a1, a0
2124+
; RV32_NOZBB-NEXT: sw zero, 12(s2)
2125+
; RV32_NOZBB-NEXT: sw zero, 8(s2)
2126+
; RV32_NOZBB-NEXT: sw s3, 0(s2)
2127+
; RV32_NOZBB-NEXT: sw a0, 4(s2)
2128+
; RV32_NOZBB-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
2129+
; RV32_NOZBB-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
2130+
; RV32_NOZBB-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
2131+
; RV32_NOZBB-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
2132+
; RV32_NOZBB-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
2133+
; RV32_NOZBB-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
2134+
; RV32_NOZBB-NEXT: addi sp, sp, 32
2135+
; RV32_NOZBB-NEXT: ret
2136+
;
2137+
; RV64NOZBB-LABEL: test_ctpop_i128:
2138+
; RV64NOZBB: # %bb.0:
2139+
; RV64NOZBB-NEXT: addi sp, sp, -32
2140+
; RV64NOZBB-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
2141+
; RV64NOZBB-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
2142+
; RV64NOZBB-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
2143+
; RV64NOZBB-NEXT: mv s0, a0
2144+
; RV64NOZBB-NEXT: mv a0, a1
2145+
; RV64NOZBB-NEXT: call __popcountdi2
2146+
; RV64NOZBB-NEXT: mv s1, a0
2147+
; RV64NOZBB-NEXT: mv a0, s0
2148+
; RV64NOZBB-NEXT: call __popcountdi2
2149+
; RV64NOZBB-NEXT: add a0, a0, s1
2150+
; RV64NOZBB-NEXT: li a1, 0
2151+
; RV64NOZBB-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
2152+
; RV64NOZBB-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
2153+
; RV64NOZBB-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
2154+
; RV64NOZBB-NEXT: addi sp, sp, 32
2155+
; RV64NOZBB-NEXT: ret
2156+
;
2157+
; RV32ZBB-LABEL: test_ctpop_i128:
2158+
; RV32ZBB: # %bb.0:
2159+
; RV32ZBB-NEXT: lw a2, 12(a1)
2160+
; RV32ZBB-NEXT: lw a3, 8(a1)
2161+
; RV32ZBB-NEXT: lw a4, 0(a1)
2162+
; RV32ZBB-NEXT: lw a1, 4(a1)
2163+
; RV32ZBB-NEXT: cpop a2, a2
2164+
; RV32ZBB-NEXT: cpop a3, a3
2165+
; RV32ZBB-NEXT: add a2, a3, a2
2166+
; RV32ZBB-NEXT: cpop a1, a1
2167+
; RV32ZBB-NEXT: cpop a3, a4
2168+
; RV32ZBB-NEXT: add a1, a3, a1
2169+
; RV32ZBB-NEXT: add a2, a1, a2
2170+
; RV32ZBB-NEXT: sltu a1, a2, a1
2171+
; RV32ZBB-NEXT: sw zero, 12(a0)
2172+
; RV32ZBB-NEXT: sw zero, 8(a0)
2173+
; RV32ZBB-NEXT: sw a2, 0(a0)
2174+
; RV32ZBB-NEXT: sw a1, 4(a0)
2175+
; RV32ZBB-NEXT: ret
2176+
;
2177+
; RV64ZBB-LABEL: test_ctpop_i128:
2178+
; RV64ZBB: # %bb.0:
2179+
; RV64ZBB-NEXT: cpop a1, a1
2180+
; RV64ZBB-NEXT: cpop a0, a0
2181+
; RV64ZBB-NEXT: add a0, a0, a1
2182+
; RV64ZBB-NEXT: li a1, 0
2183+
; RV64ZBB-NEXT: ret
2184+
;
2185+
; RV32XTHEADBB-LABEL: test_ctpop_i128:
2186+
; RV32XTHEADBB: # %bb.0:
2187+
; RV32XTHEADBB-NEXT: addi sp, sp, -32
2188+
; RV32XTHEADBB-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
2189+
; RV32XTHEADBB-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
2190+
; RV32XTHEADBB-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
2191+
; RV32XTHEADBB-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
2192+
; RV32XTHEADBB-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
2193+
; RV32XTHEADBB-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
2194+
; RV32XTHEADBB-NEXT: lw s0, 0(a1)
2195+
; RV32XTHEADBB-NEXT: lw s1, 4(a1)
2196+
; RV32XTHEADBB-NEXT: lw a2, 8(a1)
2197+
; RV32XTHEADBB-NEXT: lw a1, 12(a1)
2198+
; RV32XTHEADBB-NEXT: mv s2, a0
2199+
; RV32XTHEADBB-NEXT: mv a0, a2
2200+
; RV32XTHEADBB-NEXT: call __popcountdi2
2201+
; RV32XTHEADBB-NEXT: mv s3, a0
2202+
; RV32XTHEADBB-NEXT: mv s4, a1
2203+
; RV32XTHEADBB-NEXT: mv a0, s0
2204+
; RV32XTHEADBB-NEXT: mv a1, s1
2205+
; RV32XTHEADBB-NEXT: call __popcountdi2
2206+
; RV32XTHEADBB-NEXT: add a1, a1, s4
2207+
; RV32XTHEADBB-NEXT: add s3, a0, s3
2208+
; RV32XTHEADBB-NEXT: sltu a0, s3, a0
2209+
; RV32XTHEADBB-NEXT: add a0, a1, a0
2210+
; RV32XTHEADBB-NEXT: sw zero, 12(s2)
2211+
; RV32XTHEADBB-NEXT: sw zero, 8(s2)
2212+
; RV32XTHEADBB-NEXT: sw s3, 0(s2)
2213+
; RV32XTHEADBB-NEXT: sw a0, 4(s2)
2214+
; RV32XTHEADBB-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
2215+
; RV32XTHEADBB-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
2216+
; RV32XTHEADBB-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
2217+
; RV32XTHEADBB-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
2218+
; RV32XTHEADBB-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
2219+
; RV32XTHEADBB-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
2220+
; RV32XTHEADBB-NEXT: addi sp, sp, 32
2221+
; RV32XTHEADBB-NEXT: ret
2222+
;
2223+
; RV64XTHEADBB-LABEL: test_ctpop_i128:
2224+
; RV64XTHEADBB: # %bb.0:
2225+
; RV64XTHEADBB-NEXT: addi sp, sp, -32
2226+
; RV64XTHEADBB-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
2227+
; RV64XTHEADBB-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
2228+
; RV64XTHEADBB-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
2229+
; RV64XTHEADBB-NEXT: mv s0, a0
2230+
; RV64XTHEADBB-NEXT: mv a0, a1
2231+
; RV64XTHEADBB-NEXT: call __popcountdi2
2232+
; RV64XTHEADBB-NEXT: mv s1, a0
2233+
; RV64XTHEADBB-NEXT: mv a0, s0
2234+
; RV64XTHEADBB-NEXT: call __popcountdi2
2235+
; RV64XTHEADBB-NEXT: add a0, a0, s1
2236+
; RV64XTHEADBB-NEXT: li a1, 0
2237+
; RV64XTHEADBB-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
2238+
; RV64XTHEADBB-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
2239+
; RV64XTHEADBB-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
2240+
; RV64XTHEADBB-NEXT: addi sp, sp, 32
2241+
; RV64XTHEADBB-NEXT: ret
2242+
%1 = call i128 @llvm.ctpop.i128(i128 %a)
2243+
ret i128 %1
2244+
}
2245+
20972246
define i8 @test_parity_i8(i8 %a) {
20982247
; RV32_NOZBB-LABEL: test_parity_i8:
20992248
; RV32_NOZBB: # %bb.0:

llvm/test/CodeGen/RISCV/rv64-legal-i32/rv64zbb.ll

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,40 @@ define i64 @ctpop_i64(i64 %a) nounwind {
606606
ret i64 %1
607607
}
608608

609+
declare i128 @llvm.ctpop.i128(i128)
610+
611+
define i128 @ctpop_i128(i128 %a) nounwind {
612+
; RV64I-LABEL: ctpop_i128:
613+
; RV64I: # %bb.0:
614+
; RV64I-NEXT: addi sp, sp, -32
615+
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
616+
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
617+
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
618+
; RV64I-NEXT: mv s0, a0
619+
; RV64I-NEXT: mv a0, a1
620+
; RV64I-NEXT: call __popcountdi2
621+
; RV64I-NEXT: mv s1, a0
622+
; RV64I-NEXT: mv a0, s0
623+
; RV64I-NEXT: call __popcountdi2
624+
; RV64I-NEXT: add a0, a0, s1
625+
; RV64I-NEXT: li a1, 0
626+
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
627+
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
628+
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
629+
; RV64I-NEXT: addi sp, sp, 32
630+
; RV64I-NEXT: ret
631+
;
632+
; RV64ZBB-LABEL: ctpop_i128:
633+
; RV64ZBB: # %bb.0:
634+
; RV64ZBB-NEXT: cpop a1, a1
635+
; RV64ZBB-NEXT: cpop a0, a0
636+
; RV64ZBB-NEXT: add a0, a0, a1
637+
; RV64ZBB-NEXT: li a1, 0
638+
; RV64ZBB-NEXT: ret
639+
%1 = call i128 @llvm.ctpop.i128(i128 %a)
640+
ret i128 %1
641+
}
642+
609643
define signext i32 @sextb_i32(i32 signext %a) nounwind {
610644
; RV64I-LABEL: sextb_i32:
611645
; RV64I: # %bb.0:
@@ -673,10 +707,10 @@ define i64 @sexth_i64(i64 %a) nounwind {
673707
define signext i32 @min_i32(i32 signext %a, i32 signext %b) nounwind {
674708
; RV64I-LABEL: min_i32:
675709
; RV64I: # %bb.0:
676-
; RV64I-NEXT: blt a0, a1, .LBB18_2
710+
; RV64I-NEXT: blt a0, a1, .LBB19_2
677711
; RV64I-NEXT: # %bb.1:
678712
; RV64I-NEXT: mv a0, a1
679-
; RV64I-NEXT: .LBB18_2:
713+
; RV64I-NEXT: .LBB19_2:
680714
; RV64I-NEXT: ret
681715
;
682716
; RV64ZBB-LABEL: min_i32:
@@ -691,10 +725,10 @@ define signext i32 @min_i32(i32 signext %a, i32 signext %b) nounwind {
691725
define i64 @min_i64(i64 %a, i64 %b) nounwind {
692726
; RV64I-LABEL: min_i64:
693727
; RV64I: # %bb.0:
694-
; RV64I-NEXT: blt a0, a1, .LBB19_2
728+
; RV64I-NEXT: blt a0, a1, .LBB20_2
695729
; RV64I-NEXT: # %bb.1:
696730
; RV64I-NEXT: mv a0, a1
697-
; RV64I-NEXT: .LBB19_2:
731+
; RV64I-NEXT: .LBB20_2:
698732
; RV64I-NEXT: ret
699733
;
700734
; RV64ZBB-LABEL: min_i64:
@@ -709,10 +743,10 @@ define i64 @min_i64(i64 %a, i64 %b) nounwind {
709743
define signext i32 @max_i32(i32 signext %a, i32 signext %b) nounwind {
710744
; RV64I-LABEL: max_i32:
711745
; RV64I: # %bb.0:
712-
; RV64I-NEXT: blt a1, a0, .LBB20_2
746+
; RV64I-NEXT: blt a1, a0, .LBB21_2
713747
; RV64I-NEXT: # %bb.1:
714748
; RV64I-NEXT: mv a0, a1
715-
; RV64I-NEXT: .LBB20_2:
749+
; RV64I-NEXT: .LBB21_2:
716750
; RV64I-NEXT: ret
717751
;
718752
; RV64ZBB-LABEL: max_i32:
@@ -727,10 +761,10 @@ define signext i32 @max_i32(i32 signext %a, i32 signext %b) nounwind {
727761
define i64 @max_i64(i64 %a, i64 %b) nounwind {
728762
; RV64I-LABEL: max_i64:
729763
; RV64I: # %bb.0:
730-
; RV64I-NEXT: blt a1, a0, .LBB21_2
764+
; RV64I-NEXT: blt a1, a0, .LBB22_2
731765
; RV64I-NEXT: # %bb.1:
732766
; RV64I-NEXT: mv a0, a1
733-
; RV64I-NEXT: .LBB21_2:
767+
; RV64I-NEXT: .LBB22_2:
734768
; RV64I-NEXT: ret
735769
;
736770
; RV64ZBB-LABEL: max_i64:
@@ -745,10 +779,10 @@ define i64 @max_i64(i64 %a, i64 %b) nounwind {
745779
define signext i32 @minu_i32(i32 signext %a, i32 signext %b) nounwind {
746780
; RV64I-LABEL: minu_i32:
747781
; RV64I: # %bb.0:
748-
; RV64I-NEXT: bltu a0, a1, .LBB22_2
782+
; RV64I-NEXT: bltu a0, a1, .LBB23_2
749783
; RV64I-NEXT: # %bb.1:
750784
; RV64I-NEXT: mv a0, a1
751-
; RV64I-NEXT: .LBB22_2:
785+
; RV64I-NEXT: .LBB23_2:
752786
; RV64I-NEXT: ret
753787
;
754788
; RV64ZBB-LABEL: minu_i32:
@@ -763,10 +797,10 @@ define signext i32 @minu_i32(i32 signext %a, i32 signext %b) nounwind {
763797
define i64 @minu_i64(i64 %a, i64 %b) nounwind {
764798
; RV64I-LABEL: minu_i64:
765799
; RV64I: # %bb.0:
766-
; RV64I-NEXT: bltu a0, a1, .LBB23_2
800+
; RV64I-NEXT: bltu a0, a1, .LBB24_2
767801
; RV64I-NEXT: # %bb.1:
768802
; RV64I-NEXT: mv a0, a1
769-
; RV64I-NEXT: .LBB23_2:
803+
; RV64I-NEXT: .LBB24_2:
770804
; RV64I-NEXT: ret
771805
;
772806
; RV64ZBB-LABEL: minu_i64:
@@ -781,10 +815,10 @@ define i64 @minu_i64(i64 %a, i64 %b) nounwind {
781815
define signext i32 @maxu_i32(i32 signext %a, i32 signext %b) nounwind {
782816
; RV64I-LABEL: maxu_i32:
783817
; RV64I: # %bb.0:
784-
; RV64I-NEXT: bltu a1, a0, .LBB24_2
818+
; RV64I-NEXT: bltu a1, a0, .LBB25_2
785819
; RV64I-NEXT: # %bb.1:
786820
; RV64I-NEXT: mv a0, a1
787-
; RV64I-NEXT: .LBB24_2:
821+
; RV64I-NEXT: .LBB25_2:
788822
; RV64I-NEXT: ret
789823
;
790824
; RV64ZBB-LABEL: maxu_i32:
@@ -799,10 +833,10 @@ define signext i32 @maxu_i32(i32 signext %a, i32 signext %b) nounwind {
799833
define i64 @maxu_i64(i64 %a, i64 %b) nounwind {
800834
; RV64I-LABEL: maxu_i64:
801835
; RV64I: # %bb.0:
802-
; RV64I-NEXT: bltu a1, a0, .LBB25_2
836+
; RV64I-NEXT: bltu a1, a0, .LBB26_2
803837
; RV64I-NEXT: # %bb.1:
804838
; RV64I-NEXT: mv a0, a1
805-
; RV64I-NEXT: .LBB25_2:
839+
; RV64I-NEXT: .LBB26_2:
806840
; RV64I-NEXT: ret
807841
;
808842
; RV64ZBB-LABEL: maxu_i64:

0 commit comments

Comments
 (0)