xref: /llvm-project/llvm/test/CodeGen/LoongArch/ctpop-with-lsx.ll (revision df93327c1ad9db7ab6c71a97bc093ce7133659d8)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+lsx < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 -mattr=+lsx < %s | FileCheck %s --check-prefix=LA64
4
5declare i8 @llvm.ctpop.i8(i8)
6declare i16 @llvm.ctpop.i16(i16)
7declare i32 @llvm.ctpop.i32(i32)
8declare i64 @llvm.ctpop.i64(i64)
9
10define i8 @test_ctpop_i8(i8 %a) nounwind {
11; LA32-LABEL: test_ctpop_i8:
12; LA32:       # %bb.0:
13; LA32-NEXT:    andi $a0, $a0, 255
14; LA32-NEXT:    vldi $vr0, 0
15; LA32-NEXT:    vinsgr2vr.w $vr0, $a0, 0
16; LA32-NEXT:    vpcnt.w $vr0, $vr0
17; LA32-NEXT:    vpickve2gr.w $a0, $vr0, 0
18; LA32-NEXT:    ret
19;
20; LA64-LABEL: test_ctpop_i8:
21; LA64:       # %bb.0:
22; LA64-NEXT:    andi $a0, $a0, 255
23; LA64-NEXT:    vldi $vr0, 0
24; LA64-NEXT:    vinsgr2vr.d $vr0, $a0, 0
25; LA64-NEXT:    vpcnt.d $vr0, $vr0
26; LA64-NEXT:    vpickve2gr.d $a0, $vr0, 0
27; LA64-NEXT:    ret
28  %1 = call i8 @llvm.ctpop.i8(i8 %a)
29  ret i8 %1
30}
31
32define i16 @test_ctpop_i16(i16 %a) nounwind {
33; LA32-LABEL: test_ctpop_i16:
34; LA32:       # %bb.0:
35; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 0
36; LA32-NEXT:    vldi $vr0, 0
37; LA32-NEXT:    vinsgr2vr.w $vr0, $a0, 0
38; LA32-NEXT:    vpcnt.w $vr0, $vr0
39; LA32-NEXT:    vpickve2gr.w $a0, $vr0, 0
40; LA32-NEXT:    ret
41;
42; LA64-LABEL: test_ctpop_i16:
43; LA64:       # %bb.0:
44; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 0
45; LA64-NEXT:    vldi $vr0, 0
46; LA64-NEXT:    vinsgr2vr.d $vr0, $a0, 0
47; LA64-NEXT:    vpcnt.d $vr0, $vr0
48; LA64-NEXT:    vpickve2gr.d $a0, $vr0, 0
49; LA64-NEXT:    ret
50  %1 = call i16 @llvm.ctpop.i16(i16 %a)
51  ret i16 %1
52}
53
54define i32 @test_ctpop_i32(i32 %a) nounwind {
55; LA32-LABEL: test_ctpop_i32:
56; LA32:       # %bb.0:
57; LA32-NEXT:    vldi $vr0, 0
58; LA32-NEXT:    vinsgr2vr.w $vr0, $a0, 0
59; LA32-NEXT:    vpcnt.w $vr0, $vr0
60; LA32-NEXT:    vpickve2gr.w $a0, $vr0, 0
61; LA32-NEXT:    ret
62;
63; LA64-LABEL: test_ctpop_i32:
64; LA64:       # %bb.0:
65; LA64-NEXT:    bstrpick.d $a0, $a0, 31, 0
66; LA64-NEXT:    vldi $vr0, 0
67; LA64-NEXT:    vinsgr2vr.d $vr0, $a0, 0
68; LA64-NEXT:    vpcnt.d $vr0, $vr0
69; LA64-NEXT:    vpickve2gr.d $a0, $vr0, 0
70; LA64-NEXT:    ret
71  %1 = call i32 @llvm.ctpop.i32(i32 %a)
72  ret i32 %1
73}
74
75define i64 @test_ctpop_i64(i64 %a) nounwind {
76; LA32-LABEL: test_ctpop_i64:
77; LA32:       # %bb.0:
78; LA32-NEXT:    vldi $vr0, 0
79; LA32-NEXT:    vldi $vr1, 0
80; LA32-NEXT:    vinsgr2vr.w $vr1, $a1, 0
81; LA32-NEXT:    vpcnt.w $vr1, $vr1
82; LA32-NEXT:    vpickve2gr.w $a1, $vr1, 0
83; LA32-NEXT:    vinsgr2vr.w $vr0, $a0, 0
84; LA32-NEXT:    vpcnt.w $vr0, $vr0
85; LA32-NEXT:    vpickve2gr.w $a0, $vr0, 0
86; LA32-NEXT:    add.w $a0, $a0, $a1
87; LA32-NEXT:    move $a1, $zero
88; LA32-NEXT:    ret
89;
90; LA64-LABEL: test_ctpop_i64:
91; LA64:       # %bb.0:
92; LA64-NEXT:    vldi $vr0, 0
93; LA64-NEXT:    vinsgr2vr.d $vr0, $a0, 0
94; LA64-NEXT:    vpcnt.d $vr0, $vr0
95; LA64-NEXT:    vpickve2gr.d $a0, $vr0, 0
96; LA64-NEXT:    ret
97  %1 = call i64 @llvm.ctpop.i64(i64 %a)
98  ret i64 %1
99}
100