143 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=-32s,+lsx < %s | FileCheck %s --check-prefix=LA32R3; RUN: llc --mtriple=loongarch32 -mattr=+32s,+lsx < %s | FileCheck %s --check-prefix=LA32S4; RUN: llc --mtriple=loongarch64 -mattr=+lsx < %s | FileCheck %s --check-prefix=LA645 6declare i8 @llvm.ctpop.i8(i8)7declare i16 @llvm.ctpop.i16(i16)8declare i32 @llvm.ctpop.i32(i32)9declare i64 @llvm.ctpop.i64(i64)10 11define i8 @test_ctpop_i8(i8 %a) nounwind {12; LA32R-LABEL: test_ctpop_i8:13; LA32R: # %bb.0:14; LA32R-NEXT: andi $a0, $a0, 25515; LA32R-NEXT: vldi $vr0, 016; LA32R-NEXT: vinsgr2vr.w $vr0, $a0, 017; LA32R-NEXT: vpcnt.w $vr0, $vr018; LA32R-NEXT: vpickve2gr.w $a0, $vr0, 019; LA32R-NEXT: ret20;21; LA32S-LABEL: test_ctpop_i8:22; LA32S: # %bb.0:23; LA32S-NEXT: andi $a0, $a0, 25524; LA32S-NEXT: vldi $vr0, 025; LA32S-NEXT: vinsgr2vr.w $vr0, $a0, 026; LA32S-NEXT: vpcnt.w $vr0, $vr027; LA32S-NEXT: vpickve2gr.w $a0, $vr0, 028; LA32S-NEXT: ret29;30; LA64-LABEL: test_ctpop_i8:31; LA64: # %bb.0:32; LA64-NEXT: andi $a0, $a0, 25533; LA64-NEXT: vldi $vr0, 034; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 035; LA64-NEXT: vpcnt.d $vr0, $vr036; LA64-NEXT: vpickve2gr.d $a0, $vr0, 037; LA64-NEXT: ret38 %1 = call i8 @llvm.ctpop.i8(i8 %a)39 ret i8 %140}41 42define i16 @test_ctpop_i16(i16 %a) nounwind {43; LA32R-LABEL: test_ctpop_i16:44; LA32R: # %bb.0:45; LA32R-NEXT: lu12i.w $a1, 1546; LA32R-NEXT: ori $a1, $a1, 409547; LA32R-NEXT: and $a0, $a0, $a148; LA32R-NEXT: vldi $vr0, 049; LA32R-NEXT: vinsgr2vr.w $vr0, $a0, 050; LA32R-NEXT: vpcnt.w $vr0, $vr051; LA32R-NEXT: vpickve2gr.w $a0, $vr0, 052; LA32R-NEXT: ret53;54; LA32S-LABEL: test_ctpop_i16:55; LA32S: # %bb.0:56; LA32S-NEXT: bstrpick.w $a0, $a0, 15, 057; LA32S-NEXT: vldi $vr0, 058; LA32S-NEXT: vinsgr2vr.w $vr0, $a0, 059; LA32S-NEXT: vpcnt.w $vr0, $vr060; LA32S-NEXT: vpickve2gr.w $a0, $vr0, 061; LA32S-NEXT: ret62;63; LA64-LABEL: test_ctpop_i16:64; LA64: # %bb.0:65; LA64-NEXT: bstrpick.d $a0, $a0, 15, 066; LA64-NEXT: vldi $vr0, 067; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 068; LA64-NEXT: vpcnt.d $vr0, $vr069; LA64-NEXT: vpickve2gr.d $a0, $vr0, 070; LA64-NEXT: ret71 %1 = call i16 @llvm.ctpop.i16(i16 %a)72 ret i16 %173}74 75define i32 @test_ctpop_i32(i32 %a) nounwind {76; LA32R-LABEL: test_ctpop_i32:77; LA32R: # %bb.0:78; LA32R-NEXT: vldi $vr0, 079; LA32R-NEXT: vinsgr2vr.w $vr0, $a0, 080; LA32R-NEXT: vpcnt.w $vr0, $vr081; LA32R-NEXT: vpickve2gr.w $a0, $vr0, 082; LA32R-NEXT: ret83;84; LA32S-LABEL: test_ctpop_i32:85; LA32S: # %bb.0:86; LA32S-NEXT: vldi $vr0, 087; LA32S-NEXT: vinsgr2vr.w $vr0, $a0, 088; LA32S-NEXT: vpcnt.w $vr0, $vr089; LA32S-NEXT: vpickve2gr.w $a0, $vr0, 090; LA32S-NEXT: ret91;92; LA64-LABEL: test_ctpop_i32:93; LA64: # %bb.0:94; LA64-NEXT: bstrpick.d $a0, $a0, 31, 095; LA64-NEXT: vldi $vr0, 096; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 097; LA64-NEXT: vpcnt.d $vr0, $vr098; LA64-NEXT: vpickve2gr.d $a0, $vr0, 099; LA64-NEXT: ret100 %1 = call i32 @llvm.ctpop.i32(i32 %a)101 ret i32 %1102}103 104define i64 @test_ctpop_i64(i64 %a) nounwind {105; LA32R-LABEL: test_ctpop_i64:106; LA32R: # %bb.0:107; LA32R-NEXT: vldi $vr0, 0108; LA32R-NEXT: vldi $vr1, 0109; LA32R-NEXT: vinsgr2vr.w $vr1, $a1, 0110; LA32R-NEXT: vpcnt.w $vr1, $vr1111; LA32R-NEXT: vpickve2gr.w $a1, $vr1, 0112; LA32R-NEXT: vinsgr2vr.w $vr0, $a0, 0113; LA32R-NEXT: vpcnt.w $vr0, $vr0114; LA32R-NEXT: vpickve2gr.w $a0, $vr0, 0115; LA32R-NEXT: add.w $a0, $a0, $a1116; LA32R-NEXT: move $a1, $zero117; LA32R-NEXT: ret118;119; LA32S-LABEL: test_ctpop_i64:120; LA32S: # %bb.0:121; LA32S-NEXT: vldi $vr0, 0122; LA32S-NEXT: vldi $vr1, 0123; LA32S-NEXT: vinsgr2vr.w $vr1, $a1, 0124; LA32S-NEXT: vpcnt.w $vr1, $vr1125; LA32S-NEXT: vpickve2gr.w $a1, $vr1, 0126; LA32S-NEXT: vinsgr2vr.w $vr0, $a0, 0127; LA32S-NEXT: vpcnt.w $vr0, $vr0128; LA32S-NEXT: vpickve2gr.w $a0, $vr0, 0129; LA32S-NEXT: add.w $a0, $a0, $a1130; LA32S-NEXT: move $a1, $zero131; LA32S-NEXT: ret132;133; LA64-LABEL: test_ctpop_i64:134; LA64: # %bb.0:135; LA64-NEXT: vldi $vr0, 0136; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0137; LA64-NEXT: vpcnt.d $vr0, $vr0138; LA64-NEXT: vpickve2gr.d $a0, $vr0, 0139; LA64-NEXT: ret140 %1 = call i64 @llvm.ctpop.i64(i64 %a)141 ret i64 %1142}143