brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.8 KiB · 3d6cc81 Raw
496 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s3; RUN: llc < %s -mtriple=aarch64 -mattr -neon -aarch64-neon-syntax=apple | FileCheck -check-prefix=CHECK-NONEON %s4; RUN: llc < %s -mtriple=aarch64 -mattr +cssc -aarch64-neon-syntax=apple | FileCheck -check-prefix=CHECK-CSSC %s5; RUN: llc < %s -mtriple=aarch64_be-none-eabi | FileCheck %s --check-prefix=CHECK-BE6 7define i32 @cnt32_advsimd(i32 %x) nounwind readnone {8; CHECK-LABEL: cnt32_advsimd:9; CHECK:       // %bb.0:10; CHECK-NEXT:    fmov s0, w011; CHECK-NEXT:    cnt.8b v0, v012; CHECK-NEXT:    addv.8b b0, v013; CHECK-NEXT:    fmov w0, s014; CHECK-NEXT:    ret15;16; CHECK-NONEON-LABEL: cnt32_advsimd:17; CHECK-NONEON:       // %bb.0:18; CHECK-NONEON-NEXT:    lsr w9, w0, #119; CHECK-NONEON-NEXT:    mov w8, #16843009 // =0x101010120; CHECK-NONEON-NEXT:    and w9, w9, #0x5555555521; CHECK-NONEON-NEXT:    sub w9, w0, w922; CHECK-NONEON-NEXT:    lsr w10, w9, #223; CHECK-NONEON-NEXT:    and w9, w9, #0x3333333324; CHECK-NONEON-NEXT:    and w10, w10, #0x3333333325; CHECK-NONEON-NEXT:    add w9, w9, w1026; CHECK-NONEON-NEXT:    add w9, w9, w9, lsr #427; CHECK-NONEON-NEXT:    and w9, w9, #0xf0f0f0f28; CHECK-NONEON-NEXT:    mul w8, w9, w829; CHECK-NONEON-NEXT:    lsr w0, w8, #2430; CHECK-NONEON-NEXT:    ret31;32; CHECK-CSSC-LABEL: cnt32_advsimd:33; CHECK-CSSC:       // %bb.0:34; CHECK-CSSC-NEXT:    cnt w0, w035; CHECK-CSSC-NEXT:    ret36;37; CHECK-BE-LABEL: cnt32_advsimd:38; CHECK-BE:       // %bb.0:39; CHECK-BE-NEXT:    fmov s0, w040; CHECK-BE-NEXT:    cnt v0.8b, v0.8b41; CHECK-BE-NEXT:    addv b0, v0.8b42; CHECK-BE-NEXT:    fmov w0, s043; CHECK-BE-NEXT:    ret44  %cnt = tail call i32 @llvm.ctpop.i32(i32 %x)45  ret i32 %cnt46}47 48define i32 @cnt32_advsimd_2(<2 x i32> %x) {49; CHECK-LABEL: cnt32_advsimd_2:50; CHECK:       // %bb.0:51; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q052; CHECK-NEXT:    fmov w8, s053; CHECK-NEXT:    fmov s0, w854; CHECK-NEXT:    cnt.8b v0, v055; CHECK-NEXT:    addv.8b b0, v056; CHECK-NEXT:    fmov w0, s057; CHECK-NEXT:    ret58;59; CHECK-NONEON-LABEL: cnt32_advsimd_2:60; CHECK-NONEON:       // %bb.0:61; CHECK-NONEON-NEXT:    lsr w9, w0, #162; CHECK-NONEON-NEXT:    mov w8, #16843009 // =0x101010163; CHECK-NONEON-NEXT:    and w9, w9, #0x5555555564; CHECK-NONEON-NEXT:    sub w9, w0, w965; CHECK-NONEON-NEXT:    lsr w10, w9, #266; CHECK-NONEON-NEXT:    and w9, w9, #0x3333333367; CHECK-NONEON-NEXT:    and w10, w10, #0x3333333368; CHECK-NONEON-NEXT:    add w9, w9, w1069; CHECK-NONEON-NEXT:    add w9, w9, w9, lsr #470; CHECK-NONEON-NEXT:    and w9, w9, #0xf0f0f0f71; CHECK-NONEON-NEXT:    mul w8, w9, w872; CHECK-NONEON-NEXT:    lsr w0, w8, #2473; CHECK-NONEON-NEXT:    ret74;75; CHECK-CSSC-LABEL: cnt32_advsimd_2:76; CHECK-CSSC:       // %bb.0:77; CHECK-CSSC-NEXT:    // kill: def $d0 killed $d0 def $q078; CHECK-CSSC-NEXT:    fmov w8, s079; CHECK-CSSC-NEXT:    cnt w0, w880; CHECK-CSSC-NEXT:    ret81;82; CHECK-BE-LABEL: cnt32_advsimd_2:83; CHECK-BE:       // %bb.0:84; CHECK-BE-NEXT:    rev64 v0.2s, v0.2s85; CHECK-BE-NEXT:    fmov w8, s086; CHECK-BE-NEXT:    fmov s0, w887; CHECK-BE-NEXT:    cnt v0.8b, v0.8b88; CHECK-BE-NEXT:    addv b0, v0.8b89; CHECK-BE-NEXT:    fmov w0, s090; CHECK-BE-NEXT:    ret91  %1 = extractelement <2 x i32> %x, i64 092  %2 = tail call i32 @llvm.ctpop.i32(i32 %1)93  ret i32 %294}95 96define i64 @cnt64_advsimd(i64 %x) nounwind readnone {97; CHECK-LABEL: cnt64_advsimd:98; CHECK:       // %bb.0:99; CHECK-NEXT:    fmov d0, x0100; CHECK-NEXT:    cnt.8b v0, v0101; CHECK-NEXT:    addv.8b b0, v0102; CHECK-NEXT:    fmov x0, d0103; CHECK-NEXT:    ret104;105; CHECK-NONEON-LABEL: cnt64_advsimd:106; CHECK-NONEON:       // %bb.0:107; CHECK-NONEON-NEXT:    lsr x9, x0, #1108; CHECK-NONEON-NEXT:    mov x8, #72340172838076673 // =0x101010101010101109; CHECK-NONEON-NEXT:    and x9, x9, #0x5555555555555555110; CHECK-NONEON-NEXT:    sub x9, x0, x9111; CHECK-NONEON-NEXT:    lsr x10, x9, #2112; CHECK-NONEON-NEXT:    and x9, x9, #0x3333333333333333113; CHECK-NONEON-NEXT:    and x10, x10, #0x3333333333333333114; CHECK-NONEON-NEXT:    add x9, x9, x10115; CHECK-NONEON-NEXT:    add x9, x9, x9, lsr #4116; CHECK-NONEON-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f117; CHECK-NONEON-NEXT:    mul x8, x9, x8118; CHECK-NONEON-NEXT:    lsr x0, x8, #56119; CHECK-NONEON-NEXT:    ret120;121; CHECK-CSSC-LABEL: cnt64_advsimd:122; CHECK-CSSC:       // %bb.0:123; CHECK-CSSC-NEXT:    cnt x0, x0124; CHECK-CSSC-NEXT:    ret125;126; CHECK-BE-LABEL: cnt64_advsimd:127; CHECK-BE:       // %bb.0:128; CHECK-BE-NEXT:    fmov d0, x0129; CHECK-BE-NEXT:    rev64 v0.8b, v0.8b130; CHECK-BE-NEXT:    cnt v0.8b, v0.8b131; CHECK-BE-NEXT:    addv b0, v0.8b132; CHECK-BE-NEXT:    fmov x0, d0133; CHECK-BE-NEXT:    ret134  %cnt = tail call i64 @llvm.ctpop.i64(i64 %x)135  ret i64 %cnt136}137 138; Do not use AdvSIMD when -mno-implicit-float is specified.139; rdar://9473858140 141define i32 @cnt32(i32 %x) nounwind readnone noimplicitfloat {142; CHECK-LABEL: cnt32:143; CHECK:       // %bb.0:144; CHECK-NEXT:    lsr w9, w0, #1145; CHECK-NEXT:    mov w8, #16843009 // =0x1010101146; CHECK-NEXT:    and w9, w9, #0x55555555147; CHECK-NEXT:    sub w9, w0, w9148; CHECK-NEXT:    lsr w10, w9, #2149; CHECK-NEXT:    and w9, w9, #0x33333333150; CHECK-NEXT:    and w10, w10, #0x33333333151; CHECK-NEXT:    add w9, w9, w10152; CHECK-NEXT:    add w9, w9, w9, lsr #4153; CHECK-NEXT:    and w9, w9, #0xf0f0f0f154; CHECK-NEXT:    mul w8, w9, w8155; CHECK-NEXT:    lsr w0, w8, #24156; CHECK-NEXT:    ret157;158; CHECK-NONEON-LABEL: cnt32:159; CHECK-NONEON:       // %bb.0:160; CHECK-NONEON-NEXT:    lsr w9, w0, #1161; CHECK-NONEON-NEXT:    mov w8, #16843009 // =0x1010101162; CHECK-NONEON-NEXT:    and w9, w9, #0x55555555163; CHECK-NONEON-NEXT:    sub w9, w0, w9164; CHECK-NONEON-NEXT:    lsr w10, w9, #2165; CHECK-NONEON-NEXT:    and w9, w9, #0x33333333166; CHECK-NONEON-NEXT:    and w10, w10, #0x33333333167; CHECK-NONEON-NEXT:    add w9, w9, w10168; CHECK-NONEON-NEXT:    add w9, w9, w9, lsr #4169; CHECK-NONEON-NEXT:    and w9, w9, #0xf0f0f0f170; CHECK-NONEON-NEXT:    mul w8, w9, w8171; CHECK-NONEON-NEXT:    lsr w0, w8, #24172; CHECK-NONEON-NEXT:    ret173;174; CHECK-CSSC-LABEL: cnt32:175; CHECK-CSSC:       // %bb.0:176; CHECK-CSSC-NEXT:    cnt w0, w0177; CHECK-CSSC-NEXT:    ret178;179; CHECK-BE-LABEL: cnt32:180; CHECK-BE:       // %bb.0:181; CHECK-BE-NEXT:    lsr w9, w0, #1182; CHECK-BE-NEXT:    mov w8, #16843009 // =0x1010101183; CHECK-BE-NEXT:    and w9, w9, #0x55555555184; CHECK-BE-NEXT:    sub w9, w0, w9185; CHECK-BE-NEXT:    lsr w10, w9, #2186; CHECK-BE-NEXT:    and w9, w9, #0x33333333187; CHECK-BE-NEXT:    and w10, w10, #0x33333333188; CHECK-BE-NEXT:    add w9, w9, w10189; CHECK-BE-NEXT:    add w9, w9, w9, lsr #4190; CHECK-BE-NEXT:    and w9, w9, #0xf0f0f0f191; CHECK-BE-NEXT:    mul w8, w9, w8192; CHECK-BE-NEXT:    lsr w0, w8, #24193; CHECK-BE-NEXT:    ret194  %cnt = tail call i32 @llvm.ctpop.i32(i32 %x)195  ret i32 %cnt196}197 198define i64 @cnt64(i64 %x) nounwind readnone noimplicitfloat {199; CHECK-LABEL: cnt64:200; CHECK:       // %bb.0:201; CHECK-NEXT:    lsr x9, x0, #1202; CHECK-NEXT:    mov x8, #72340172838076673 // =0x101010101010101203; CHECK-NEXT:    and x9, x9, #0x5555555555555555204; CHECK-NEXT:    sub x9, x0, x9205; CHECK-NEXT:    lsr x10, x9, #2206; CHECK-NEXT:    and x9, x9, #0x3333333333333333207; CHECK-NEXT:    and x10, x10, #0x3333333333333333208; CHECK-NEXT:    add x9, x9, x10209; CHECK-NEXT:    add x9, x9, x9, lsr #4210; CHECK-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f211; CHECK-NEXT:    mul x8, x9, x8212; CHECK-NEXT:    lsr x0, x8, #56213; CHECK-NEXT:    ret214;215; CHECK-NONEON-LABEL: cnt64:216; CHECK-NONEON:       // %bb.0:217; CHECK-NONEON-NEXT:    lsr x9, x0, #1218; CHECK-NONEON-NEXT:    mov x8, #72340172838076673 // =0x101010101010101219; CHECK-NONEON-NEXT:    and x9, x9, #0x5555555555555555220; CHECK-NONEON-NEXT:    sub x9, x0, x9221; CHECK-NONEON-NEXT:    lsr x10, x9, #2222; CHECK-NONEON-NEXT:    and x9, x9, #0x3333333333333333223; CHECK-NONEON-NEXT:    and x10, x10, #0x3333333333333333224; CHECK-NONEON-NEXT:    add x9, x9, x10225; CHECK-NONEON-NEXT:    add x9, x9, x9, lsr #4226; CHECK-NONEON-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f227; CHECK-NONEON-NEXT:    mul x8, x9, x8228; CHECK-NONEON-NEXT:    lsr x0, x8, #56229; CHECK-NONEON-NEXT:    ret230;231; CHECK-CSSC-LABEL: cnt64:232; CHECK-CSSC:       // %bb.0:233; CHECK-CSSC-NEXT:    cnt x0, x0234; CHECK-CSSC-NEXT:    ret235;236; CHECK-BE-LABEL: cnt64:237; CHECK-BE:       // %bb.0:238; CHECK-BE-NEXT:    lsr x9, x0, #1239; CHECK-BE-NEXT:    mov x8, #72340172838076673 // =0x101010101010101240; CHECK-BE-NEXT:    and x9, x9, #0x5555555555555555241; CHECK-BE-NEXT:    sub x9, x0, x9242; CHECK-BE-NEXT:    lsr x10, x9, #2243; CHECK-BE-NEXT:    and x9, x9, #0x3333333333333333244; CHECK-BE-NEXT:    and x10, x10, #0x3333333333333333245; CHECK-BE-NEXT:    add x9, x9, x10246; CHECK-BE-NEXT:    add x9, x9, x9, lsr #4247; CHECK-BE-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f248; CHECK-BE-NEXT:    mul x8, x9, x8249; CHECK-BE-NEXT:    lsr x0, x8, #56250; CHECK-BE-NEXT:    ret251  %cnt = tail call i64 @llvm.ctpop.i64(i64 %x)252  ret i64 %cnt253}254 255define i32 @ctpop_eq_one(i64 %x) nounwind readnone {256; CHECK-LABEL: ctpop_eq_one:257; CHECK:       // %bb.0:258; CHECK-NEXT:    sub x8, x0, #1259; CHECK-NEXT:    eor x9, x0, x8260; CHECK-NEXT:    cmp x9, x8261; CHECK-NEXT:    cset w0, hi262; CHECK-NEXT:    ret263;264; CHECK-NONEON-LABEL: ctpop_eq_one:265; CHECK-NONEON:       // %bb.0:266; CHECK-NONEON-NEXT:    sub x8, x0, #1267; CHECK-NONEON-NEXT:    eor x9, x0, x8268; CHECK-NONEON-NEXT:    cmp x9, x8269; CHECK-NONEON-NEXT:    cset w0, hi270; CHECK-NONEON-NEXT:    ret271;272; CHECK-CSSC-LABEL: ctpop_eq_one:273; CHECK-CSSC:       // %bb.0:274; CHECK-CSSC-NEXT:    cnt x8, x0275; CHECK-CSSC-NEXT:    cmp x8, #1276; CHECK-CSSC-NEXT:    cset w0, eq277; CHECK-CSSC-NEXT:    ret278;279; CHECK-BE-LABEL: ctpop_eq_one:280; CHECK-BE:       // %bb.0:281; CHECK-BE-NEXT:    sub x8, x0, #1282; CHECK-BE-NEXT:    eor x9, x0, x8283; CHECK-BE-NEXT:    cmp x9, x8284; CHECK-BE-NEXT:    cset w0, hi285; CHECK-BE-NEXT:    ret286  %count = tail call i64 @llvm.ctpop.i64(i64 %x)287  %cmp = icmp eq i64 %count, 1288  %conv = zext i1 %cmp to i32289  ret i32 %conv290}291 292define i32 @ctpop_ne_one(i64 %x) nounwind readnone {293; CHECK-LABEL: ctpop_ne_one:294; CHECK:       // %bb.0:295; CHECK-NEXT:    sub x8, x0, #1296; CHECK-NEXT:    eor x9, x0, x8297; CHECK-NEXT:    cmp x9, x8298; CHECK-NEXT:    cset w0, ls299; CHECK-NEXT:    ret300;301; CHECK-NONEON-LABEL: ctpop_ne_one:302; CHECK-NONEON:       // %bb.0:303; CHECK-NONEON-NEXT:    sub x8, x0, #1304; CHECK-NONEON-NEXT:    eor x9, x0, x8305; CHECK-NONEON-NEXT:    cmp x9, x8306; CHECK-NONEON-NEXT:    cset w0, ls307; CHECK-NONEON-NEXT:    ret308;309; CHECK-CSSC-LABEL: ctpop_ne_one:310; CHECK-CSSC:       // %bb.0:311; CHECK-CSSC-NEXT:    cnt x8, x0312; CHECK-CSSC-NEXT:    cmp x8, #1313; CHECK-CSSC-NEXT:    cset w0, ne314; CHECK-CSSC-NEXT:    ret315;316; CHECK-BE-LABEL: ctpop_ne_one:317; CHECK-BE:       // %bb.0:318; CHECK-BE-NEXT:    sub x8, x0, #1319; CHECK-BE-NEXT:    eor x9, x0, x8320; CHECK-BE-NEXT:    cmp x9, x8321; CHECK-BE-NEXT:    cset w0, ls322; CHECK-BE-NEXT:    ret323  %count = tail call i64 @llvm.ctpop.i64(i64 %x)324  %cmp = icmp ne i64 %count, 1325  %conv = zext i1 %cmp to i32326  ret i32 %conv327}328 329define i1 @ctpop32_ne_one(i32 %x) nounwind readnone {330; CHECK-LABEL: ctpop32_ne_one:331; CHECK:       // %bb.0:332; CHECK-NEXT:    sub w8, w0, #1333; CHECK-NEXT:    eor w9, w0, w8334; CHECK-NEXT:    cmp w9, w8335; CHECK-NEXT:    cset w0, ls336; CHECK-NEXT:    ret337;338; CHECK-NONEON-LABEL: ctpop32_ne_one:339; CHECK-NONEON:       // %bb.0:340; CHECK-NONEON-NEXT:    sub w8, w0, #1341; CHECK-NONEON-NEXT:    eor w9, w0, w8342; CHECK-NONEON-NEXT:    cmp w9, w8343; CHECK-NONEON-NEXT:    cset w0, ls344; CHECK-NONEON-NEXT:    ret345;346; CHECK-CSSC-LABEL: ctpop32_ne_one:347; CHECK-CSSC:       // %bb.0:348; CHECK-CSSC-NEXT:    cnt w8, w0349; CHECK-CSSC-NEXT:    cmp w8, #1350; CHECK-CSSC-NEXT:    cset w0, ne351; CHECK-CSSC-NEXT:    ret352;353; CHECK-BE-LABEL: ctpop32_ne_one:354; CHECK-BE:       // %bb.0:355; CHECK-BE-NEXT:    sub w8, w0, #1356; CHECK-BE-NEXT:    eor w9, w0, w8357; CHECK-BE-NEXT:    cmp w9, w8358; CHECK-BE-NEXT:    cset w0, ls359; CHECK-BE-NEXT:    ret360  %count = tail call i32 @llvm.ctpop.i32(i32 %x)361  %cmp = icmp ne i32 %count, 1362  ret i1 %cmp363}364 365define i1 @ctpop32_eq_one_nonzero(i32 %x) {366; CHECK-LABEL: ctpop32_eq_one_nonzero:367; CHECK:       // %bb.0: // %entry368; CHECK-NEXT:    sub w8, w0, #1369; CHECK-NEXT:    tst w0, w8370; CHECK-NEXT:    cset w0, eq371; CHECK-NEXT:    ret372;373; CHECK-NONEON-LABEL: ctpop32_eq_one_nonzero:374; CHECK-NONEON:       // %bb.0: // %entry375; CHECK-NONEON-NEXT:    sub w8, w0, #1376; CHECK-NONEON-NEXT:    tst w0, w8377; CHECK-NONEON-NEXT:    cset w0, eq378; CHECK-NONEON-NEXT:    ret379;380; CHECK-CSSC-LABEL: ctpop32_eq_one_nonzero:381; CHECK-CSSC:       // %bb.0: // %entry382; CHECK-CSSC-NEXT:    sub w8, w0, #1383; CHECK-CSSC-NEXT:    tst w0, w8384; CHECK-CSSC-NEXT:    cset w0, eq385; CHECK-CSSC-NEXT:    ret386;387; CHECK-BE-LABEL: ctpop32_eq_one_nonzero:388; CHECK-BE:       // %bb.0: // %entry389; CHECK-BE-NEXT:    sub w8, w0, #1390; CHECK-BE-NEXT:    tst w0, w8391; CHECK-BE-NEXT:    cset w0, eq392; CHECK-BE-NEXT:    ret393entry:394  %popcnt = call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %x)395  %cmp = icmp eq i32 %popcnt, 1396  ret i1 %cmp397}398 399define i1 @ctpop32_ne_one_nonzero(i32 %x) {400; CHECK-LABEL: ctpop32_ne_one_nonzero:401; CHECK:       // %bb.0: // %entry402; CHECK-NEXT:    sub w8, w0, #1403; CHECK-NEXT:    tst w0, w8404; CHECK-NEXT:    cset w0, ne405; CHECK-NEXT:    ret406;407; CHECK-NONEON-LABEL: ctpop32_ne_one_nonzero:408; CHECK-NONEON:       // %bb.0: // %entry409; CHECK-NONEON-NEXT:    sub w8, w0, #1410; CHECK-NONEON-NEXT:    tst w0, w8411; CHECK-NONEON-NEXT:    cset w0, ne412; CHECK-NONEON-NEXT:    ret413;414; CHECK-CSSC-LABEL: ctpop32_ne_one_nonzero:415; CHECK-CSSC:       // %bb.0: // %entry416; CHECK-CSSC-NEXT:    sub w8, w0, #1417; CHECK-CSSC-NEXT:    and	w8, w0, w8418; CHECK-CSSC-NEXT:    umin w0, w8, #1419; CHECK-CSSC-NEXT:    ret420;421; CHECK-BE-LABEL: ctpop32_ne_one_nonzero:422; CHECK-BE:       // %bb.0: // %entry423; CHECK-BE-NEXT:    sub w8, w0, #1424; CHECK-BE-NEXT:    tst w0, w8425; CHECK-BE-NEXT:    cset w0, ne426; CHECK-BE-NEXT:    ret427entry:428  %popcnt = tail call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 %x)429  %cmp = icmp ne i32 %popcnt, 1430  ret i1 %cmp431}432 433define i128 @cnt128(i128 %x) nounwind readnone {434; CHECK-LABEL: cnt128:435; CHECK:       // %bb.0:436; CHECK-NEXT:    fmov d0, x0437; CHECK-NEXT:    mov.d v0[1], x1438; CHECK-NEXT:    mov x1, xzr439; CHECK-NEXT:    cnt.16b v0, v0440; CHECK-NEXT:    addv.16b b0, v0441; CHECK-NEXT:    fmov x0, d0442; CHECK-NEXT:    ret443;444; CHECK-NONEON-LABEL: cnt128:445; CHECK-NONEON:       // %bb.0:446; CHECK-NONEON-NEXT:    lsr x9, x0, #1447; CHECK-NONEON-NEXT:    lsr x10, x1, #1448; CHECK-NONEON-NEXT:    mov x8, #72340172838076673 // =0x101010101010101449; CHECK-NONEON-NEXT:    and x9, x9, #0x5555555555555555450; CHECK-NONEON-NEXT:    and x10, x10, #0x5555555555555555451; CHECK-NONEON-NEXT:    sub x9, x0, x9452; CHECK-NONEON-NEXT:    sub x10, x1, x10453; CHECK-NONEON-NEXT:    mov x1, xzr454; CHECK-NONEON-NEXT:    lsr x11, x9, #2455; CHECK-NONEON-NEXT:    lsr x12, x10, #2456; CHECK-NONEON-NEXT:    and x9, x9, #0x3333333333333333457; CHECK-NONEON-NEXT:    and x10, x10, #0x3333333333333333458; CHECK-NONEON-NEXT:    and x11, x11, #0x3333333333333333459; CHECK-NONEON-NEXT:    add x9, x9, x11460; CHECK-NONEON-NEXT:    and x11, x12, #0x3333333333333333461; CHECK-NONEON-NEXT:    add x9, x9, x9, lsr #4462; CHECK-NONEON-NEXT:    add x10, x10, x11463; CHECK-NONEON-NEXT:    add x10, x10, x10, lsr #4464; CHECK-NONEON-NEXT:    and x9, x9, #0xf0f0f0f0f0f0f0f465; CHECK-NONEON-NEXT:    mul x9, x9, x8466; CHECK-NONEON-NEXT:    and x10, x10, #0xf0f0f0f0f0f0f0f467; CHECK-NONEON-NEXT:    mul x8, x10, x8468; CHECK-NONEON-NEXT:    lsr x9, x9, #56469; CHECK-NONEON-NEXT:    add x0, x9, x8, lsr #56470; CHECK-NONEON-NEXT:    ret471;472; CHECK-CSSC-LABEL: cnt128:473; CHECK-CSSC:       // %bb.0:474; CHECK-CSSC-NEXT:    cnt x8, x1475; CHECK-CSSC-NEXT:    cnt x9, x0476; CHECK-CSSC-NEXT:    mov x1, xzr477; CHECK-CSSC-NEXT:    add x0, x9, x8478; CHECK-CSSC-NEXT:    ret479;480; CHECK-BE-LABEL: cnt128:481; CHECK-BE:       // %bb.0:482; CHECK-BE-NEXT:    fmov d0, x0483; CHECK-BE-NEXT:    mov x0, xzr484; CHECK-BE-NEXT:    mov v0.d[1], x1485; CHECK-BE-NEXT:    rev64 v0.16b, v0.16b486; CHECK-BE-NEXT:    cnt v0.16b, v0.16b487; CHECK-BE-NEXT:    addv b0, v0.16b488; CHECK-BE-NEXT:    fmov x1, d0489; CHECK-BE-NEXT:    ret490  %cnt = tail call i128 @llvm.ctpop.i128(i128 %x)491  ret i128 %cnt492}493 494declare i32 @llvm.ctpop.i32(i32) nounwind readnone495declare i64 @llvm.ctpop.i64(i64) nounwind readnone496