1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX2,LMULMAX2-RV32 3; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX2,LMULMAX2-RV64 4; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX1,LMULMAX1-RV32 5; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX1,LMULMAX1-RV64 6 7define void @ctpop_v16i8(<16 x i8>* %x, <16 x i8>* %y) { 8; CHECK-LABEL: ctpop_v16i8: 9; CHECK: # %bb.0: 10; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, mu 11; CHECK-NEXT: vle8.v v25, (a0) 12; CHECK-NEXT: vsrl.vi v26, v25, 1 13; CHECK-NEXT: addi a1, zero, 85 14; CHECK-NEXT: vand.vx v26, v26, a1 15; CHECK-NEXT: vsub.vv v25, v25, v26 16; CHECK-NEXT: addi a1, zero, 51 17; CHECK-NEXT: vand.vx v26, v25, a1 18; CHECK-NEXT: vsrl.vi v25, v25, 2 19; CHECK-NEXT: vand.vx v25, v25, a1 20; CHECK-NEXT: vadd.vv v25, v26, v25 21; CHECK-NEXT: vsrl.vi v26, v25, 4 22; CHECK-NEXT: vadd.vv v25, v25, v26 23; CHECK-NEXT: vand.vi v25, v25, 15 24; CHECK-NEXT: vse8.v v25, (a0) 25; CHECK-NEXT: ret 26 %a = load <16 x i8>, <16 x i8>* %x 27 %b = load <16 x i8>, <16 x i8>* %y 28 %c = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %a) 29 store <16 x i8> %c, <16 x i8>* %x 30 ret void 31} 32declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>) 33 34define void @ctpop_v8i16(<8 x i16>* %x, <8 x i16>* %y) { 35; LMULMAX2-RV32-LABEL: ctpop_v8i16: 36; LMULMAX2-RV32: # %bb.0: 37; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu 38; LMULMAX2-RV32-NEXT: vle16.v v25, (a0) 39; LMULMAX2-RV32-NEXT: vsrl.vi v26, v25, 1 40; LMULMAX2-RV32-NEXT: lui a1, 5 41; LMULMAX2-RV32-NEXT: addi a1, a1, 1365 42; LMULMAX2-RV32-NEXT: vand.vx v26, v26, a1 43; LMULMAX2-RV32-NEXT: vsub.vv v25, v25, v26 44; LMULMAX2-RV32-NEXT: lui a1, 3 45; LMULMAX2-RV32-NEXT: addi a1, a1, 819 46; LMULMAX2-RV32-NEXT: vand.vx v26, v25, a1 47; LMULMAX2-RV32-NEXT: vsrl.vi v25, v25, 2 48; LMULMAX2-RV32-NEXT: vand.vx v25, v25, a1 49; LMULMAX2-RV32-NEXT: vadd.vv v25, v26, v25 50; LMULMAX2-RV32-NEXT: vsrl.vi v26, v25, 4 51; LMULMAX2-RV32-NEXT: vadd.vv v25, v25, v26 52; LMULMAX2-RV32-NEXT: lui a1, 1 53; LMULMAX2-RV32-NEXT: addi a1, a1, -241 54; LMULMAX2-RV32-NEXT: vand.vx v25, v25, a1 55; LMULMAX2-RV32-NEXT: addi a1, zero, 257 56; LMULMAX2-RV32-NEXT: vmul.vx v25, v25, a1 57; LMULMAX2-RV32-NEXT: vsrl.vi v25, v25, 8 58; LMULMAX2-RV32-NEXT: vse16.v v25, (a0) 59; LMULMAX2-RV32-NEXT: ret 60; 61; LMULMAX2-RV64-LABEL: ctpop_v8i16: 62; LMULMAX2-RV64: # %bb.0: 63; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu 64; LMULMAX2-RV64-NEXT: vle16.v v25, (a0) 65; LMULMAX2-RV64-NEXT: vsrl.vi v26, v25, 1 66; LMULMAX2-RV64-NEXT: lui a1, 5 67; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 68; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 69; LMULMAX2-RV64-NEXT: vsub.vv v25, v25, v26 70; LMULMAX2-RV64-NEXT: lui a1, 3 71; LMULMAX2-RV64-NEXT: addiw a1, a1, 819 72; LMULMAX2-RV64-NEXT: vand.vx v26, v25, a1 73; LMULMAX2-RV64-NEXT: vsrl.vi v25, v25, 2 74; LMULMAX2-RV64-NEXT: vand.vx v25, v25, a1 75; LMULMAX2-RV64-NEXT: vadd.vv v25, v26, v25 76; LMULMAX2-RV64-NEXT: vsrl.vi v26, v25, 4 77; LMULMAX2-RV64-NEXT: vadd.vv v25, v25, v26 78; LMULMAX2-RV64-NEXT: lui a1, 1 79; LMULMAX2-RV64-NEXT: addiw a1, a1, -241 80; LMULMAX2-RV64-NEXT: vand.vx v25, v25, a1 81; LMULMAX2-RV64-NEXT: addi a1, zero, 257 82; LMULMAX2-RV64-NEXT: vmul.vx v25, v25, a1 83; LMULMAX2-RV64-NEXT: vsrl.vi v25, v25, 8 84; LMULMAX2-RV64-NEXT: vse16.v v25, (a0) 85; LMULMAX2-RV64-NEXT: ret 86; 87; LMULMAX1-RV32-LABEL: ctpop_v8i16: 88; LMULMAX1-RV32: # %bb.0: 89; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu 90; LMULMAX1-RV32-NEXT: vle16.v v25, (a0) 91; LMULMAX1-RV32-NEXT: vsrl.vi v26, v25, 1 92; LMULMAX1-RV32-NEXT: lui a1, 5 93; LMULMAX1-RV32-NEXT: addi a1, a1, 1365 94; LMULMAX1-RV32-NEXT: vand.vx v26, v26, a1 95; LMULMAX1-RV32-NEXT: vsub.vv v25, v25, v26 96; LMULMAX1-RV32-NEXT: lui a1, 3 97; LMULMAX1-RV32-NEXT: addi a1, a1, 819 98; LMULMAX1-RV32-NEXT: vand.vx v26, v25, a1 99; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 2 100; LMULMAX1-RV32-NEXT: vand.vx v25, v25, a1 101; LMULMAX1-RV32-NEXT: vadd.vv v25, v26, v25 102; LMULMAX1-RV32-NEXT: vsrl.vi v26, v25, 4 103; LMULMAX1-RV32-NEXT: vadd.vv v25, v25, v26 104; LMULMAX1-RV32-NEXT: lui a1, 1 105; LMULMAX1-RV32-NEXT: addi a1, a1, -241 106; LMULMAX1-RV32-NEXT: vand.vx v25, v25, a1 107; LMULMAX1-RV32-NEXT: addi a1, zero, 257 108; LMULMAX1-RV32-NEXT: vmul.vx v25, v25, a1 109; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 8 110; LMULMAX1-RV32-NEXT: vse16.v v25, (a0) 111; LMULMAX1-RV32-NEXT: ret 112; 113; LMULMAX1-RV64-LABEL: ctpop_v8i16: 114; LMULMAX1-RV64: # %bb.0: 115; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu 116; LMULMAX1-RV64-NEXT: vle16.v v25, (a0) 117; LMULMAX1-RV64-NEXT: vsrl.vi v26, v25, 1 118; LMULMAX1-RV64-NEXT: lui a1, 5 119; LMULMAX1-RV64-NEXT: addiw a1, a1, 1365 120; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a1 121; LMULMAX1-RV64-NEXT: vsub.vv v25, v25, v26 122; LMULMAX1-RV64-NEXT: lui a1, 3 123; LMULMAX1-RV64-NEXT: addiw a1, a1, 819 124; LMULMAX1-RV64-NEXT: vand.vx v26, v25, a1 125; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 2 126; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a1 127; LMULMAX1-RV64-NEXT: vadd.vv v25, v26, v25 128; LMULMAX1-RV64-NEXT: vsrl.vi v26, v25, 4 129; LMULMAX1-RV64-NEXT: vadd.vv v25, v25, v26 130; LMULMAX1-RV64-NEXT: lui a1, 1 131; LMULMAX1-RV64-NEXT: addiw a1, a1, -241 132; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a1 133; LMULMAX1-RV64-NEXT: addi a1, zero, 257 134; LMULMAX1-RV64-NEXT: vmul.vx v25, v25, a1 135; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 8 136; LMULMAX1-RV64-NEXT: vse16.v v25, (a0) 137; LMULMAX1-RV64-NEXT: ret 138 %a = load <8 x i16>, <8 x i16>* %x 139 %b = load <8 x i16>, <8 x i16>* %y 140 %c = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %a) 141 store <8 x i16> %c, <8 x i16>* %x 142 ret void 143} 144declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>) 145 146define void @ctpop_v4i32(<4 x i32>* %x, <4 x i32>* %y) { 147; LMULMAX2-RV32-LABEL: ctpop_v4i32: 148; LMULMAX2-RV32: # %bb.0: 149; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 150; LMULMAX2-RV32-NEXT: vle32.v v25, (a0) 151; LMULMAX2-RV32-NEXT: vsrl.vi v26, v25, 1 152; LMULMAX2-RV32-NEXT: lui a1, 349525 153; LMULMAX2-RV32-NEXT: addi a1, a1, 1365 154; LMULMAX2-RV32-NEXT: vand.vx v26, v26, a1 155; LMULMAX2-RV32-NEXT: vsub.vv v25, v25, v26 156; LMULMAX2-RV32-NEXT: lui a1, 209715 157; LMULMAX2-RV32-NEXT: addi a1, a1, 819 158; LMULMAX2-RV32-NEXT: vand.vx v26, v25, a1 159; LMULMAX2-RV32-NEXT: vsrl.vi v25, v25, 2 160; LMULMAX2-RV32-NEXT: vand.vx v25, v25, a1 161; LMULMAX2-RV32-NEXT: vadd.vv v25, v26, v25 162; LMULMAX2-RV32-NEXT: vsrl.vi v26, v25, 4 163; LMULMAX2-RV32-NEXT: vadd.vv v25, v25, v26 164; LMULMAX2-RV32-NEXT: lui a1, 61681 165; LMULMAX2-RV32-NEXT: addi a1, a1, -241 166; LMULMAX2-RV32-NEXT: vand.vx v25, v25, a1 167; LMULMAX2-RV32-NEXT: lui a1, 4112 168; LMULMAX2-RV32-NEXT: addi a1, a1, 257 169; LMULMAX2-RV32-NEXT: vmul.vx v25, v25, a1 170; LMULMAX2-RV32-NEXT: vsrl.vi v25, v25, 24 171; LMULMAX2-RV32-NEXT: vse32.v v25, (a0) 172; LMULMAX2-RV32-NEXT: ret 173; 174; LMULMAX2-RV64-LABEL: ctpop_v4i32: 175; LMULMAX2-RV64: # %bb.0: 176; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu 177; LMULMAX2-RV64-NEXT: vle32.v v25, (a0) 178; LMULMAX2-RV64-NEXT: vsrl.vi v26, v25, 1 179; LMULMAX2-RV64-NEXT: lui a1, 349525 180; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 181; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 182; LMULMAX2-RV64-NEXT: vsub.vv v25, v25, v26 183; LMULMAX2-RV64-NEXT: lui a1, 209715 184; LMULMAX2-RV64-NEXT: addiw a1, a1, 819 185; LMULMAX2-RV64-NEXT: vand.vx v26, v25, a1 186; LMULMAX2-RV64-NEXT: vsrl.vi v25, v25, 2 187; LMULMAX2-RV64-NEXT: vand.vx v25, v25, a1 188; LMULMAX2-RV64-NEXT: vadd.vv v25, v26, v25 189; LMULMAX2-RV64-NEXT: vsrl.vi v26, v25, 4 190; LMULMAX2-RV64-NEXT: vadd.vv v25, v25, v26 191; LMULMAX2-RV64-NEXT: lui a1, 61681 192; LMULMAX2-RV64-NEXT: addiw a1, a1, -241 193; LMULMAX2-RV64-NEXT: vand.vx v25, v25, a1 194; LMULMAX2-RV64-NEXT: lui a1, 4112 195; LMULMAX2-RV64-NEXT: addiw a1, a1, 257 196; LMULMAX2-RV64-NEXT: vmul.vx v25, v25, a1 197; LMULMAX2-RV64-NEXT: vsrl.vi v25, v25, 24 198; LMULMAX2-RV64-NEXT: vse32.v v25, (a0) 199; LMULMAX2-RV64-NEXT: ret 200; 201; LMULMAX1-RV32-LABEL: ctpop_v4i32: 202; LMULMAX1-RV32: # %bb.0: 203; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 204; LMULMAX1-RV32-NEXT: vle32.v v25, (a0) 205; LMULMAX1-RV32-NEXT: vsrl.vi v26, v25, 1 206; LMULMAX1-RV32-NEXT: lui a1, 349525 207; LMULMAX1-RV32-NEXT: addi a1, a1, 1365 208; LMULMAX1-RV32-NEXT: vand.vx v26, v26, a1 209; LMULMAX1-RV32-NEXT: vsub.vv v25, v25, v26 210; LMULMAX1-RV32-NEXT: lui a1, 209715 211; LMULMAX1-RV32-NEXT: addi a1, a1, 819 212; LMULMAX1-RV32-NEXT: vand.vx v26, v25, a1 213; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 2 214; LMULMAX1-RV32-NEXT: vand.vx v25, v25, a1 215; LMULMAX1-RV32-NEXT: vadd.vv v25, v26, v25 216; LMULMAX1-RV32-NEXT: vsrl.vi v26, v25, 4 217; LMULMAX1-RV32-NEXT: vadd.vv v25, v25, v26 218; LMULMAX1-RV32-NEXT: lui a1, 61681 219; LMULMAX1-RV32-NEXT: addi a1, a1, -241 220; LMULMAX1-RV32-NEXT: vand.vx v25, v25, a1 221; LMULMAX1-RV32-NEXT: lui a1, 4112 222; LMULMAX1-RV32-NEXT: addi a1, a1, 257 223; LMULMAX1-RV32-NEXT: vmul.vx v25, v25, a1 224; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 24 225; LMULMAX1-RV32-NEXT: vse32.v v25, (a0) 226; LMULMAX1-RV32-NEXT: ret 227; 228; LMULMAX1-RV64-LABEL: ctpop_v4i32: 229; LMULMAX1-RV64: # %bb.0: 230; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu 231; LMULMAX1-RV64-NEXT: vle32.v v25, (a0) 232; LMULMAX1-RV64-NEXT: vsrl.vi v26, v25, 1 233; LMULMAX1-RV64-NEXT: lui a1, 349525 234; LMULMAX1-RV64-NEXT: addiw a1, a1, 1365 235; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a1 236; LMULMAX1-RV64-NEXT: vsub.vv v25, v25, v26 237; LMULMAX1-RV64-NEXT: lui a1, 209715 238; LMULMAX1-RV64-NEXT: addiw a1, a1, 819 239; LMULMAX1-RV64-NEXT: vand.vx v26, v25, a1 240; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 2 241; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a1 242; LMULMAX1-RV64-NEXT: vadd.vv v25, v26, v25 243; LMULMAX1-RV64-NEXT: vsrl.vi v26, v25, 4 244; LMULMAX1-RV64-NEXT: vadd.vv v25, v25, v26 245; LMULMAX1-RV64-NEXT: lui a1, 61681 246; LMULMAX1-RV64-NEXT: addiw a1, a1, -241 247; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a1 248; LMULMAX1-RV64-NEXT: lui a1, 4112 249; LMULMAX1-RV64-NEXT: addiw a1, a1, 257 250; LMULMAX1-RV64-NEXT: vmul.vx v25, v25, a1 251; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 24 252; LMULMAX1-RV64-NEXT: vse32.v v25, (a0) 253; LMULMAX1-RV64-NEXT: ret 254 %a = load <4 x i32>, <4 x i32>* %x 255 %b = load <4 x i32>, <4 x i32>* %y 256 %c = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %a) 257 store <4 x i32> %c, <4 x i32>* %x 258 ret void 259} 260declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>) 261 262define void @ctpop_v2i64(<2 x i64>* %x, <2 x i64>* %y) { 263; LMULMAX2-RV32-LABEL: ctpop_v2i64: 264; LMULMAX2-RV32: # %bb.0: 265; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 266; LMULMAX2-RV32-NEXT: vle64.v v25, (a0) 267; LMULMAX2-RV32-NEXT: vsrl.vi v26, v25, 1 268; LMULMAX2-RV32-NEXT: lui a1, 349525 269; LMULMAX2-RV32-NEXT: addi a1, a1, 1365 270; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 271; LMULMAX2-RV32-NEXT: vmv.v.x v27, a1 272; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 273; LMULMAX2-RV32-NEXT: vand.vv v26, v26, v27 274; LMULMAX2-RV32-NEXT: vsub.vv v25, v25, v26 275; LMULMAX2-RV32-NEXT: lui a1, 209715 276; LMULMAX2-RV32-NEXT: addi a1, a1, 819 277; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 278; LMULMAX2-RV32-NEXT: vmv.v.x v26, a1 279; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 280; LMULMAX2-RV32-NEXT: vand.vv v27, v25, v26 281; LMULMAX2-RV32-NEXT: vsrl.vi v25, v25, 2 282; LMULMAX2-RV32-NEXT: vand.vv v25, v25, v26 283; LMULMAX2-RV32-NEXT: vadd.vv v25, v27, v25 284; LMULMAX2-RV32-NEXT: vsrl.vi v26, v25, 4 285; LMULMAX2-RV32-NEXT: vadd.vv v25, v25, v26 286; LMULMAX2-RV32-NEXT: lui a1, 61681 287; LMULMAX2-RV32-NEXT: addi a1, a1, -241 288; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 289; LMULMAX2-RV32-NEXT: vmv.v.x v26, a1 290; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 291; LMULMAX2-RV32-NEXT: vand.vv v25, v25, v26 292; LMULMAX2-RV32-NEXT: lui a1, 4112 293; LMULMAX2-RV32-NEXT: addi a1, a1, 257 294; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 295; LMULMAX2-RV32-NEXT: vmv.v.x v26, a1 296; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 297; LMULMAX2-RV32-NEXT: vmul.vv v25, v25, v26 298; LMULMAX2-RV32-NEXT: addi a1, zero, 56 299; LMULMAX2-RV32-NEXT: vsrl.vx v25, v25, a1 300; LMULMAX2-RV32-NEXT: vse64.v v25, (a0) 301; LMULMAX2-RV32-NEXT: ret 302; 303; LMULMAX2-RV64-LABEL: ctpop_v2i64: 304; LMULMAX2-RV64: # %bb.0: 305; LMULMAX2-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu 306; LMULMAX2-RV64-NEXT: vle64.v v25, (a0) 307; LMULMAX2-RV64-NEXT: vsrl.vi v26, v25, 1 308; LMULMAX2-RV64-NEXT: lui a1, 21845 309; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 310; LMULMAX2-RV64-NEXT: slli a1, a1, 12 311; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 312; LMULMAX2-RV64-NEXT: slli a1, a1, 12 313; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 314; LMULMAX2-RV64-NEXT: slli a1, a1, 12 315; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 316; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 317; LMULMAX2-RV64-NEXT: vsub.vv v25, v25, v26 318; LMULMAX2-RV64-NEXT: lui a1, 13107 319; LMULMAX2-RV64-NEXT: addiw a1, a1, 819 320; LMULMAX2-RV64-NEXT: slli a1, a1, 12 321; LMULMAX2-RV64-NEXT: addi a1, a1, 819 322; LMULMAX2-RV64-NEXT: slli a1, a1, 12 323; LMULMAX2-RV64-NEXT: addi a1, a1, 819 324; LMULMAX2-RV64-NEXT: slli a1, a1, 12 325; LMULMAX2-RV64-NEXT: addi a1, a1, 819 326; LMULMAX2-RV64-NEXT: vand.vx v26, v25, a1 327; LMULMAX2-RV64-NEXT: vsrl.vi v25, v25, 2 328; LMULMAX2-RV64-NEXT: vand.vx v25, v25, a1 329; LMULMAX2-RV64-NEXT: vadd.vv v25, v26, v25 330; LMULMAX2-RV64-NEXT: vsrl.vi v26, v25, 4 331; LMULMAX2-RV64-NEXT: vadd.vv v25, v25, v26 332; LMULMAX2-RV64-NEXT: lui a1, 3855 333; LMULMAX2-RV64-NEXT: addiw a1, a1, 241 334; LMULMAX2-RV64-NEXT: slli a1, a1, 12 335; LMULMAX2-RV64-NEXT: addi a1, a1, -241 336; LMULMAX2-RV64-NEXT: slli a1, a1, 12 337; LMULMAX2-RV64-NEXT: addi a1, a1, 241 338; LMULMAX2-RV64-NEXT: slli a1, a1, 12 339; LMULMAX2-RV64-NEXT: addi a1, a1, -241 340; LMULMAX2-RV64-NEXT: vand.vx v25, v25, a1 341; LMULMAX2-RV64-NEXT: lui a1, 4112 342; LMULMAX2-RV64-NEXT: addiw a1, a1, 257 343; LMULMAX2-RV64-NEXT: slli a1, a1, 16 344; LMULMAX2-RV64-NEXT: addi a1, a1, 257 345; LMULMAX2-RV64-NEXT: slli a1, a1, 16 346; LMULMAX2-RV64-NEXT: addi a1, a1, 257 347; LMULMAX2-RV64-NEXT: vmul.vx v25, v25, a1 348; LMULMAX2-RV64-NEXT: addi a1, zero, 56 349; LMULMAX2-RV64-NEXT: vsrl.vx v25, v25, a1 350; LMULMAX2-RV64-NEXT: vse64.v v25, (a0) 351; LMULMAX2-RV64-NEXT: ret 352; 353; LMULMAX1-RV32-LABEL: ctpop_v2i64: 354; LMULMAX1-RV32: # %bb.0: 355; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 356; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) 357; LMULMAX1-RV32-NEXT: vsrl.vi v26, v25, 1 358; LMULMAX1-RV32-NEXT: lui a1, 349525 359; LMULMAX1-RV32-NEXT: addi a1, a1, 1365 360; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 361; LMULMAX1-RV32-NEXT: vmv.v.x v27, a1 362; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 363; LMULMAX1-RV32-NEXT: vand.vv v26, v26, v27 364; LMULMAX1-RV32-NEXT: vsub.vv v25, v25, v26 365; LMULMAX1-RV32-NEXT: lui a1, 209715 366; LMULMAX1-RV32-NEXT: addi a1, a1, 819 367; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 368; LMULMAX1-RV32-NEXT: vmv.v.x v26, a1 369; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 370; LMULMAX1-RV32-NEXT: vand.vv v27, v25, v26 371; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 2 372; LMULMAX1-RV32-NEXT: vand.vv v25, v25, v26 373; LMULMAX1-RV32-NEXT: vadd.vv v25, v27, v25 374; LMULMAX1-RV32-NEXT: vsrl.vi v26, v25, 4 375; LMULMAX1-RV32-NEXT: vadd.vv v25, v25, v26 376; LMULMAX1-RV32-NEXT: lui a1, 61681 377; LMULMAX1-RV32-NEXT: addi a1, a1, -241 378; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 379; LMULMAX1-RV32-NEXT: vmv.v.x v26, a1 380; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 381; LMULMAX1-RV32-NEXT: vand.vv v25, v25, v26 382; LMULMAX1-RV32-NEXT: lui a1, 4112 383; LMULMAX1-RV32-NEXT: addi a1, a1, 257 384; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 385; LMULMAX1-RV32-NEXT: vmv.v.x v26, a1 386; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 387; LMULMAX1-RV32-NEXT: vmul.vv v25, v25, v26 388; LMULMAX1-RV32-NEXT: addi a1, zero, 56 389; LMULMAX1-RV32-NEXT: vsrl.vx v25, v25, a1 390; LMULMAX1-RV32-NEXT: vse64.v v25, (a0) 391; LMULMAX1-RV32-NEXT: ret 392; 393; LMULMAX1-RV64-LABEL: ctpop_v2i64: 394; LMULMAX1-RV64: # %bb.0: 395; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu 396; LMULMAX1-RV64-NEXT: vle64.v v25, (a0) 397; LMULMAX1-RV64-NEXT: vsrl.vi v26, v25, 1 398; LMULMAX1-RV64-NEXT: lui a1, 21845 399; LMULMAX1-RV64-NEXT: addiw a1, a1, 1365 400; LMULMAX1-RV64-NEXT: slli a1, a1, 12 401; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 402; LMULMAX1-RV64-NEXT: slli a1, a1, 12 403; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 404; LMULMAX1-RV64-NEXT: slli a1, a1, 12 405; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 406; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a1 407; LMULMAX1-RV64-NEXT: vsub.vv v25, v25, v26 408; LMULMAX1-RV64-NEXT: lui a1, 13107 409; LMULMAX1-RV64-NEXT: addiw a1, a1, 819 410; LMULMAX1-RV64-NEXT: slli a1, a1, 12 411; LMULMAX1-RV64-NEXT: addi a1, a1, 819 412; LMULMAX1-RV64-NEXT: slli a1, a1, 12 413; LMULMAX1-RV64-NEXT: addi a1, a1, 819 414; LMULMAX1-RV64-NEXT: slli a1, a1, 12 415; LMULMAX1-RV64-NEXT: addi a1, a1, 819 416; LMULMAX1-RV64-NEXT: vand.vx v26, v25, a1 417; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 2 418; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a1 419; LMULMAX1-RV64-NEXT: vadd.vv v25, v26, v25 420; LMULMAX1-RV64-NEXT: vsrl.vi v26, v25, 4 421; LMULMAX1-RV64-NEXT: vadd.vv v25, v25, v26 422; LMULMAX1-RV64-NEXT: lui a1, 3855 423; LMULMAX1-RV64-NEXT: addiw a1, a1, 241 424; LMULMAX1-RV64-NEXT: slli a1, a1, 12 425; LMULMAX1-RV64-NEXT: addi a1, a1, -241 426; LMULMAX1-RV64-NEXT: slli a1, a1, 12 427; LMULMAX1-RV64-NEXT: addi a1, a1, 241 428; LMULMAX1-RV64-NEXT: slli a1, a1, 12 429; LMULMAX1-RV64-NEXT: addi a1, a1, -241 430; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a1 431; LMULMAX1-RV64-NEXT: lui a1, 4112 432; LMULMAX1-RV64-NEXT: addiw a1, a1, 257 433; LMULMAX1-RV64-NEXT: slli a1, a1, 16 434; LMULMAX1-RV64-NEXT: addi a1, a1, 257 435; LMULMAX1-RV64-NEXT: slli a1, a1, 16 436; LMULMAX1-RV64-NEXT: addi a1, a1, 257 437; LMULMAX1-RV64-NEXT: vmul.vx v25, v25, a1 438; LMULMAX1-RV64-NEXT: addi a1, zero, 56 439; LMULMAX1-RV64-NEXT: vsrl.vx v25, v25, a1 440; LMULMAX1-RV64-NEXT: vse64.v v25, (a0) 441; LMULMAX1-RV64-NEXT: ret 442 %a = load <2 x i64>, <2 x i64>* %x 443 %b = load <2 x i64>, <2 x i64>* %y 444 %c = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %a) 445 store <2 x i64> %c, <2 x i64>* %x 446 ret void 447} 448declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>) 449 450define void @ctpop_v32i8(<32 x i8>* %x, <32 x i8>* %y) { 451; LMULMAX2-LABEL: ctpop_v32i8: 452; LMULMAX2: # %bb.0: 453; LMULMAX2-NEXT: addi a1, zero, 32 454; LMULMAX2-NEXT: vsetvli zero, a1, e8, m2, ta, mu 455; LMULMAX2-NEXT: vle8.v v26, (a0) 456; LMULMAX2-NEXT: vsrl.vi v28, v26, 1 457; LMULMAX2-NEXT: addi a1, zero, 85 458; LMULMAX2-NEXT: vand.vx v28, v28, a1 459; LMULMAX2-NEXT: vsub.vv v26, v26, v28 460; LMULMAX2-NEXT: addi a1, zero, 51 461; LMULMAX2-NEXT: vand.vx v28, v26, a1 462; LMULMAX2-NEXT: vsrl.vi v26, v26, 2 463; LMULMAX2-NEXT: vand.vx v26, v26, a1 464; LMULMAX2-NEXT: vadd.vv v26, v28, v26 465; LMULMAX2-NEXT: vsrl.vi v28, v26, 4 466; LMULMAX2-NEXT: vadd.vv v26, v26, v28 467; LMULMAX2-NEXT: vand.vi v26, v26, 15 468; LMULMAX2-NEXT: vse8.v v26, (a0) 469; LMULMAX2-NEXT: ret 470; 471; LMULMAX1-LABEL: ctpop_v32i8: 472; LMULMAX1: # %bb.0: 473; LMULMAX1-NEXT: vsetivli zero, 16, e8, m1, ta, mu 474; LMULMAX1-NEXT: addi a1, a0, 16 475; LMULMAX1-NEXT: vle8.v v25, (a1) 476; LMULMAX1-NEXT: vle8.v v26, (a0) 477; LMULMAX1-NEXT: vsrl.vi v27, v25, 1 478; LMULMAX1-NEXT: addi a2, zero, 85 479; LMULMAX1-NEXT: vand.vx v27, v27, a2 480; LMULMAX1-NEXT: vsub.vv v25, v25, v27 481; LMULMAX1-NEXT: addi a3, zero, 51 482; LMULMAX1-NEXT: vand.vx v27, v25, a3 483; LMULMAX1-NEXT: vsrl.vi v25, v25, 2 484; LMULMAX1-NEXT: vand.vx v25, v25, a3 485; LMULMAX1-NEXT: vadd.vv v25, v27, v25 486; LMULMAX1-NEXT: vsrl.vi v27, v25, 4 487; LMULMAX1-NEXT: vadd.vv v25, v25, v27 488; LMULMAX1-NEXT: vand.vi v25, v25, 15 489; LMULMAX1-NEXT: vsrl.vi v27, v26, 1 490; LMULMAX1-NEXT: vand.vx v27, v27, a2 491; LMULMAX1-NEXT: vsub.vv v26, v26, v27 492; LMULMAX1-NEXT: vand.vx v27, v26, a3 493; LMULMAX1-NEXT: vsrl.vi v26, v26, 2 494; LMULMAX1-NEXT: vand.vx v26, v26, a3 495; LMULMAX1-NEXT: vadd.vv v26, v27, v26 496; LMULMAX1-NEXT: vsrl.vi v27, v26, 4 497; LMULMAX1-NEXT: vadd.vv v26, v26, v27 498; LMULMAX1-NEXT: vand.vi v26, v26, 15 499; LMULMAX1-NEXT: vse8.v v26, (a0) 500; LMULMAX1-NEXT: vse8.v v25, (a1) 501; LMULMAX1-NEXT: ret 502 %a = load <32 x i8>, <32 x i8>* %x 503 %b = load <32 x i8>, <32 x i8>* %y 504 %c = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %a) 505 store <32 x i8> %c, <32 x i8>* %x 506 ret void 507} 508declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>) 509 510define void @ctpop_v16i16(<16 x i16>* %x, <16 x i16>* %y) { 511; LMULMAX2-RV32-LABEL: ctpop_v16i16: 512; LMULMAX2-RV32: # %bb.0: 513; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, mu 514; LMULMAX2-RV32-NEXT: vle16.v v26, (a0) 515; LMULMAX2-RV32-NEXT: vsrl.vi v28, v26, 1 516; LMULMAX2-RV32-NEXT: lui a1, 5 517; LMULMAX2-RV32-NEXT: addi a1, a1, 1365 518; LMULMAX2-RV32-NEXT: vand.vx v28, v28, a1 519; LMULMAX2-RV32-NEXT: vsub.vv v26, v26, v28 520; LMULMAX2-RV32-NEXT: lui a1, 3 521; LMULMAX2-RV32-NEXT: addi a1, a1, 819 522; LMULMAX2-RV32-NEXT: vand.vx v28, v26, a1 523; LMULMAX2-RV32-NEXT: vsrl.vi v26, v26, 2 524; LMULMAX2-RV32-NEXT: vand.vx v26, v26, a1 525; LMULMAX2-RV32-NEXT: vadd.vv v26, v28, v26 526; LMULMAX2-RV32-NEXT: vsrl.vi v28, v26, 4 527; LMULMAX2-RV32-NEXT: vadd.vv v26, v26, v28 528; LMULMAX2-RV32-NEXT: lui a1, 1 529; LMULMAX2-RV32-NEXT: addi a1, a1, -241 530; LMULMAX2-RV32-NEXT: vand.vx v26, v26, a1 531; LMULMAX2-RV32-NEXT: addi a1, zero, 257 532; LMULMAX2-RV32-NEXT: vmul.vx v26, v26, a1 533; LMULMAX2-RV32-NEXT: vsrl.vi v26, v26, 8 534; LMULMAX2-RV32-NEXT: vse16.v v26, (a0) 535; LMULMAX2-RV32-NEXT: ret 536; 537; LMULMAX2-RV64-LABEL: ctpop_v16i16: 538; LMULMAX2-RV64: # %bb.0: 539; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e16, m2, ta, mu 540; LMULMAX2-RV64-NEXT: vle16.v v26, (a0) 541; LMULMAX2-RV64-NEXT: vsrl.vi v28, v26, 1 542; LMULMAX2-RV64-NEXT: lui a1, 5 543; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 544; LMULMAX2-RV64-NEXT: vand.vx v28, v28, a1 545; LMULMAX2-RV64-NEXT: vsub.vv v26, v26, v28 546; LMULMAX2-RV64-NEXT: lui a1, 3 547; LMULMAX2-RV64-NEXT: addiw a1, a1, 819 548; LMULMAX2-RV64-NEXT: vand.vx v28, v26, a1 549; LMULMAX2-RV64-NEXT: vsrl.vi v26, v26, 2 550; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 551; LMULMAX2-RV64-NEXT: vadd.vv v26, v28, v26 552; LMULMAX2-RV64-NEXT: vsrl.vi v28, v26, 4 553; LMULMAX2-RV64-NEXT: vadd.vv v26, v26, v28 554; LMULMAX2-RV64-NEXT: lui a1, 1 555; LMULMAX2-RV64-NEXT: addiw a1, a1, -241 556; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 557; LMULMAX2-RV64-NEXT: addi a1, zero, 257 558; LMULMAX2-RV64-NEXT: vmul.vx v26, v26, a1 559; LMULMAX2-RV64-NEXT: vsrl.vi v26, v26, 8 560; LMULMAX2-RV64-NEXT: vse16.v v26, (a0) 561; LMULMAX2-RV64-NEXT: ret 562; 563; LMULMAX1-RV32-LABEL: ctpop_v16i16: 564; LMULMAX1-RV32: # %bb.0: 565; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu 566; LMULMAX1-RV32-NEXT: addi a1, a0, 16 567; LMULMAX1-RV32-NEXT: vle16.v v25, (a1) 568; LMULMAX1-RV32-NEXT: vle16.v v26, (a0) 569; LMULMAX1-RV32-NEXT: vsrl.vi v27, v25, 1 570; LMULMAX1-RV32-NEXT: lui a2, 5 571; LMULMAX1-RV32-NEXT: addi a2, a2, 1365 572; LMULMAX1-RV32-NEXT: vand.vx v27, v27, a2 573; LMULMAX1-RV32-NEXT: vsub.vv v25, v25, v27 574; LMULMAX1-RV32-NEXT: lui a3, 3 575; LMULMAX1-RV32-NEXT: addi a3, a3, 819 576; LMULMAX1-RV32-NEXT: vand.vx v27, v25, a3 577; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 2 578; LMULMAX1-RV32-NEXT: vand.vx v25, v25, a3 579; LMULMAX1-RV32-NEXT: vadd.vv v25, v27, v25 580; LMULMAX1-RV32-NEXT: vsrl.vi v27, v25, 4 581; LMULMAX1-RV32-NEXT: vadd.vv v25, v25, v27 582; LMULMAX1-RV32-NEXT: lui a4, 1 583; LMULMAX1-RV32-NEXT: addi a4, a4, -241 584; LMULMAX1-RV32-NEXT: vand.vx v25, v25, a4 585; LMULMAX1-RV32-NEXT: addi a5, zero, 257 586; LMULMAX1-RV32-NEXT: vmul.vx v25, v25, a5 587; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 8 588; LMULMAX1-RV32-NEXT: vsrl.vi v27, v26, 1 589; LMULMAX1-RV32-NEXT: vand.vx v27, v27, a2 590; LMULMAX1-RV32-NEXT: vsub.vv v26, v26, v27 591; LMULMAX1-RV32-NEXT: vand.vx v27, v26, a3 592; LMULMAX1-RV32-NEXT: vsrl.vi v26, v26, 2 593; LMULMAX1-RV32-NEXT: vand.vx v26, v26, a3 594; LMULMAX1-RV32-NEXT: vadd.vv v26, v27, v26 595; LMULMAX1-RV32-NEXT: vsrl.vi v27, v26, 4 596; LMULMAX1-RV32-NEXT: vadd.vv v26, v26, v27 597; LMULMAX1-RV32-NEXT: vand.vx v26, v26, a4 598; LMULMAX1-RV32-NEXT: vmul.vx v26, v26, a5 599; LMULMAX1-RV32-NEXT: vsrl.vi v26, v26, 8 600; LMULMAX1-RV32-NEXT: vse16.v v26, (a0) 601; LMULMAX1-RV32-NEXT: vse16.v v25, (a1) 602; LMULMAX1-RV32-NEXT: ret 603; 604; LMULMAX1-RV64-LABEL: ctpop_v16i16: 605; LMULMAX1-RV64: # %bb.0: 606; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu 607; LMULMAX1-RV64-NEXT: addi a1, a0, 16 608; LMULMAX1-RV64-NEXT: vle16.v v25, (a1) 609; LMULMAX1-RV64-NEXT: vle16.v v26, (a0) 610; LMULMAX1-RV64-NEXT: vsrl.vi v27, v25, 1 611; LMULMAX1-RV64-NEXT: lui a2, 5 612; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 613; LMULMAX1-RV64-NEXT: vand.vx v27, v27, a2 614; LMULMAX1-RV64-NEXT: vsub.vv v25, v25, v27 615; LMULMAX1-RV64-NEXT: lui a3, 3 616; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 617; LMULMAX1-RV64-NEXT: vand.vx v27, v25, a3 618; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 2 619; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a3 620; LMULMAX1-RV64-NEXT: vadd.vv v25, v27, v25 621; LMULMAX1-RV64-NEXT: vsrl.vi v27, v25, 4 622; LMULMAX1-RV64-NEXT: vadd.vv v25, v25, v27 623; LMULMAX1-RV64-NEXT: lui a4, 1 624; LMULMAX1-RV64-NEXT: addiw a4, a4, -241 625; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a4 626; LMULMAX1-RV64-NEXT: addi a5, zero, 257 627; LMULMAX1-RV64-NEXT: vmul.vx v25, v25, a5 628; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 8 629; LMULMAX1-RV64-NEXT: vsrl.vi v27, v26, 1 630; LMULMAX1-RV64-NEXT: vand.vx v27, v27, a2 631; LMULMAX1-RV64-NEXT: vsub.vv v26, v26, v27 632; LMULMAX1-RV64-NEXT: vand.vx v27, v26, a3 633; LMULMAX1-RV64-NEXT: vsrl.vi v26, v26, 2 634; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a3 635; LMULMAX1-RV64-NEXT: vadd.vv v26, v27, v26 636; LMULMAX1-RV64-NEXT: vsrl.vi v27, v26, 4 637; LMULMAX1-RV64-NEXT: vadd.vv v26, v26, v27 638; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a4 639; LMULMAX1-RV64-NEXT: vmul.vx v26, v26, a5 640; LMULMAX1-RV64-NEXT: vsrl.vi v26, v26, 8 641; LMULMAX1-RV64-NEXT: vse16.v v26, (a0) 642; LMULMAX1-RV64-NEXT: vse16.v v25, (a1) 643; LMULMAX1-RV64-NEXT: ret 644 %a = load <16 x i16>, <16 x i16>* %x 645 %b = load <16 x i16>, <16 x i16>* %y 646 %c = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %a) 647 store <16 x i16> %c, <16 x i16>* %x 648 ret void 649} 650declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>) 651 652define void @ctpop_v8i32(<8 x i32>* %x, <8 x i32>* %y) { 653; LMULMAX2-RV32-LABEL: ctpop_v8i32: 654; LMULMAX2-RV32: # %bb.0: 655; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu 656; LMULMAX2-RV32-NEXT: vle32.v v26, (a0) 657; LMULMAX2-RV32-NEXT: vsrl.vi v28, v26, 1 658; LMULMAX2-RV32-NEXT: lui a1, 349525 659; LMULMAX2-RV32-NEXT: addi a1, a1, 1365 660; LMULMAX2-RV32-NEXT: vand.vx v28, v28, a1 661; LMULMAX2-RV32-NEXT: vsub.vv v26, v26, v28 662; LMULMAX2-RV32-NEXT: lui a1, 209715 663; LMULMAX2-RV32-NEXT: addi a1, a1, 819 664; LMULMAX2-RV32-NEXT: vand.vx v28, v26, a1 665; LMULMAX2-RV32-NEXT: vsrl.vi v26, v26, 2 666; LMULMAX2-RV32-NEXT: vand.vx v26, v26, a1 667; LMULMAX2-RV32-NEXT: vadd.vv v26, v28, v26 668; LMULMAX2-RV32-NEXT: vsrl.vi v28, v26, 4 669; LMULMAX2-RV32-NEXT: vadd.vv v26, v26, v28 670; LMULMAX2-RV32-NEXT: lui a1, 61681 671; LMULMAX2-RV32-NEXT: addi a1, a1, -241 672; LMULMAX2-RV32-NEXT: vand.vx v26, v26, a1 673; LMULMAX2-RV32-NEXT: lui a1, 4112 674; LMULMAX2-RV32-NEXT: addi a1, a1, 257 675; LMULMAX2-RV32-NEXT: vmul.vx v26, v26, a1 676; LMULMAX2-RV32-NEXT: vsrl.vi v26, v26, 24 677; LMULMAX2-RV32-NEXT: vse32.v v26, (a0) 678; LMULMAX2-RV32-NEXT: ret 679; 680; LMULMAX2-RV64-LABEL: ctpop_v8i32: 681; LMULMAX2-RV64: # %bb.0: 682; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e32, m2, ta, mu 683; LMULMAX2-RV64-NEXT: vle32.v v26, (a0) 684; LMULMAX2-RV64-NEXT: vsrl.vi v28, v26, 1 685; LMULMAX2-RV64-NEXT: lui a1, 349525 686; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 687; LMULMAX2-RV64-NEXT: vand.vx v28, v28, a1 688; LMULMAX2-RV64-NEXT: vsub.vv v26, v26, v28 689; LMULMAX2-RV64-NEXT: lui a1, 209715 690; LMULMAX2-RV64-NEXT: addiw a1, a1, 819 691; LMULMAX2-RV64-NEXT: vand.vx v28, v26, a1 692; LMULMAX2-RV64-NEXT: vsrl.vi v26, v26, 2 693; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 694; LMULMAX2-RV64-NEXT: vadd.vv v26, v28, v26 695; LMULMAX2-RV64-NEXT: vsrl.vi v28, v26, 4 696; LMULMAX2-RV64-NEXT: vadd.vv v26, v26, v28 697; LMULMAX2-RV64-NEXT: lui a1, 61681 698; LMULMAX2-RV64-NEXT: addiw a1, a1, -241 699; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 700; LMULMAX2-RV64-NEXT: lui a1, 4112 701; LMULMAX2-RV64-NEXT: addiw a1, a1, 257 702; LMULMAX2-RV64-NEXT: vmul.vx v26, v26, a1 703; LMULMAX2-RV64-NEXT: vsrl.vi v26, v26, 24 704; LMULMAX2-RV64-NEXT: vse32.v v26, (a0) 705; LMULMAX2-RV64-NEXT: ret 706; 707; LMULMAX1-RV32-LABEL: ctpop_v8i32: 708; LMULMAX1-RV32: # %bb.0: 709; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 710; LMULMAX1-RV32-NEXT: addi a1, a0, 16 711; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) 712; LMULMAX1-RV32-NEXT: vle32.v v26, (a0) 713; LMULMAX1-RV32-NEXT: vsrl.vi v27, v25, 1 714; LMULMAX1-RV32-NEXT: lui a2, 349525 715; LMULMAX1-RV32-NEXT: addi a2, a2, 1365 716; LMULMAX1-RV32-NEXT: vand.vx v27, v27, a2 717; LMULMAX1-RV32-NEXT: vsub.vv v25, v25, v27 718; LMULMAX1-RV32-NEXT: lui a3, 209715 719; LMULMAX1-RV32-NEXT: addi a3, a3, 819 720; LMULMAX1-RV32-NEXT: vand.vx v27, v25, a3 721; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 2 722; LMULMAX1-RV32-NEXT: vand.vx v25, v25, a3 723; LMULMAX1-RV32-NEXT: vadd.vv v25, v27, v25 724; LMULMAX1-RV32-NEXT: vsrl.vi v27, v25, 4 725; LMULMAX1-RV32-NEXT: vadd.vv v25, v25, v27 726; LMULMAX1-RV32-NEXT: lui a4, 61681 727; LMULMAX1-RV32-NEXT: addi a4, a4, -241 728; LMULMAX1-RV32-NEXT: vand.vx v25, v25, a4 729; LMULMAX1-RV32-NEXT: lui a5, 4112 730; LMULMAX1-RV32-NEXT: addi a5, a5, 257 731; LMULMAX1-RV32-NEXT: vmul.vx v25, v25, a5 732; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 24 733; LMULMAX1-RV32-NEXT: vsrl.vi v27, v26, 1 734; LMULMAX1-RV32-NEXT: vand.vx v27, v27, a2 735; LMULMAX1-RV32-NEXT: vsub.vv v26, v26, v27 736; LMULMAX1-RV32-NEXT: vand.vx v27, v26, a3 737; LMULMAX1-RV32-NEXT: vsrl.vi v26, v26, 2 738; LMULMAX1-RV32-NEXT: vand.vx v26, v26, a3 739; LMULMAX1-RV32-NEXT: vadd.vv v26, v27, v26 740; LMULMAX1-RV32-NEXT: vsrl.vi v27, v26, 4 741; LMULMAX1-RV32-NEXT: vadd.vv v26, v26, v27 742; LMULMAX1-RV32-NEXT: vand.vx v26, v26, a4 743; LMULMAX1-RV32-NEXT: vmul.vx v26, v26, a5 744; LMULMAX1-RV32-NEXT: vsrl.vi v26, v26, 24 745; LMULMAX1-RV32-NEXT: vse32.v v26, (a0) 746; LMULMAX1-RV32-NEXT: vse32.v v25, (a1) 747; LMULMAX1-RV32-NEXT: ret 748; 749; LMULMAX1-RV64-LABEL: ctpop_v8i32: 750; LMULMAX1-RV64: # %bb.0: 751; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu 752; LMULMAX1-RV64-NEXT: addi a1, a0, 16 753; LMULMAX1-RV64-NEXT: vle32.v v25, (a1) 754; LMULMAX1-RV64-NEXT: vle32.v v26, (a0) 755; LMULMAX1-RV64-NEXT: vsrl.vi v27, v25, 1 756; LMULMAX1-RV64-NEXT: lui a2, 349525 757; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 758; LMULMAX1-RV64-NEXT: vand.vx v27, v27, a2 759; LMULMAX1-RV64-NEXT: vsub.vv v25, v25, v27 760; LMULMAX1-RV64-NEXT: lui a3, 209715 761; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 762; LMULMAX1-RV64-NEXT: vand.vx v27, v25, a3 763; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 2 764; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a3 765; LMULMAX1-RV64-NEXT: vadd.vv v25, v27, v25 766; LMULMAX1-RV64-NEXT: vsrl.vi v27, v25, 4 767; LMULMAX1-RV64-NEXT: vadd.vv v25, v25, v27 768; LMULMAX1-RV64-NEXT: lui a4, 61681 769; LMULMAX1-RV64-NEXT: addiw a4, a4, -241 770; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a4 771; LMULMAX1-RV64-NEXT: lui a5, 4112 772; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 773; LMULMAX1-RV64-NEXT: vmul.vx v25, v25, a5 774; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 24 775; LMULMAX1-RV64-NEXT: vsrl.vi v27, v26, 1 776; LMULMAX1-RV64-NEXT: vand.vx v27, v27, a2 777; LMULMAX1-RV64-NEXT: vsub.vv v26, v26, v27 778; LMULMAX1-RV64-NEXT: vand.vx v27, v26, a3 779; LMULMAX1-RV64-NEXT: vsrl.vi v26, v26, 2 780; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a3 781; LMULMAX1-RV64-NEXT: vadd.vv v26, v27, v26 782; LMULMAX1-RV64-NEXT: vsrl.vi v27, v26, 4 783; LMULMAX1-RV64-NEXT: vadd.vv v26, v26, v27 784; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a4 785; LMULMAX1-RV64-NEXT: vmul.vx v26, v26, a5 786; LMULMAX1-RV64-NEXT: vsrl.vi v26, v26, 24 787; LMULMAX1-RV64-NEXT: vse32.v v26, (a0) 788; LMULMAX1-RV64-NEXT: vse32.v v25, (a1) 789; LMULMAX1-RV64-NEXT: ret 790 %a = load <8 x i32>, <8 x i32>* %x 791 %b = load <8 x i32>, <8 x i32>* %y 792 %c = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %a) 793 store <8 x i32> %c, <8 x i32>* %x 794 ret void 795} 796declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>) 797 798define void @ctpop_v4i64(<4 x i64>* %x, <4 x i64>* %y) { 799; LMULMAX2-RV32-LABEL: ctpop_v4i64: 800; LMULMAX2-RV32: # %bb.0: 801; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu 802; LMULMAX2-RV32-NEXT: vle64.v v26, (a0) 803; LMULMAX2-RV32-NEXT: vsrl.vi v28, v26, 1 804; LMULMAX2-RV32-NEXT: lui a1, 349525 805; LMULMAX2-RV32-NEXT: addi a1, a1, 1365 806; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu 807; LMULMAX2-RV32-NEXT: vmv.v.x v30, a1 808; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu 809; LMULMAX2-RV32-NEXT: vand.vv v28, v28, v30 810; LMULMAX2-RV32-NEXT: vsub.vv v26, v26, v28 811; LMULMAX2-RV32-NEXT: lui a1, 209715 812; LMULMAX2-RV32-NEXT: addi a1, a1, 819 813; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu 814; LMULMAX2-RV32-NEXT: vmv.v.x v28, a1 815; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu 816; LMULMAX2-RV32-NEXT: vand.vv v30, v26, v28 817; LMULMAX2-RV32-NEXT: vsrl.vi v26, v26, 2 818; LMULMAX2-RV32-NEXT: vand.vv v26, v26, v28 819; LMULMAX2-RV32-NEXT: vadd.vv v26, v30, v26 820; LMULMAX2-RV32-NEXT: vsrl.vi v28, v26, 4 821; LMULMAX2-RV32-NEXT: vadd.vv v26, v26, v28 822; LMULMAX2-RV32-NEXT: lui a1, 61681 823; LMULMAX2-RV32-NEXT: addi a1, a1, -241 824; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu 825; LMULMAX2-RV32-NEXT: vmv.v.x v28, a1 826; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu 827; LMULMAX2-RV32-NEXT: vand.vv v26, v26, v28 828; LMULMAX2-RV32-NEXT: lui a1, 4112 829; LMULMAX2-RV32-NEXT: addi a1, a1, 257 830; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu 831; LMULMAX2-RV32-NEXT: vmv.v.x v28, a1 832; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu 833; LMULMAX2-RV32-NEXT: vmul.vv v26, v26, v28 834; LMULMAX2-RV32-NEXT: addi a1, zero, 56 835; LMULMAX2-RV32-NEXT: vsrl.vx v26, v26, a1 836; LMULMAX2-RV32-NEXT: vse64.v v26, (a0) 837; LMULMAX2-RV32-NEXT: ret 838; 839; LMULMAX2-RV64-LABEL: ctpop_v4i64: 840; LMULMAX2-RV64: # %bb.0: 841; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e64, m2, ta, mu 842; LMULMAX2-RV64-NEXT: vle64.v v26, (a0) 843; LMULMAX2-RV64-NEXT: vsrl.vi v28, v26, 1 844; LMULMAX2-RV64-NEXT: lui a1, 21845 845; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 846; LMULMAX2-RV64-NEXT: slli a1, a1, 12 847; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 848; LMULMAX2-RV64-NEXT: slli a1, a1, 12 849; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 850; LMULMAX2-RV64-NEXT: slli a1, a1, 12 851; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 852; LMULMAX2-RV64-NEXT: vand.vx v28, v28, a1 853; LMULMAX2-RV64-NEXT: vsub.vv v26, v26, v28 854; LMULMAX2-RV64-NEXT: lui a1, 13107 855; LMULMAX2-RV64-NEXT: addiw a1, a1, 819 856; LMULMAX2-RV64-NEXT: slli a1, a1, 12 857; LMULMAX2-RV64-NEXT: addi a1, a1, 819 858; LMULMAX2-RV64-NEXT: slli a1, a1, 12 859; LMULMAX2-RV64-NEXT: addi a1, a1, 819 860; LMULMAX2-RV64-NEXT: slli a1, a1, 12 861; LMULMAX2-RV64-NEXT: addi a1, a1, 819 862; LMULMAX2-RV64-NEXT: vand.vx v28, v26, a1 863; LMULMAX2-RV64-NEXT: vsrl.vi v26, v26, 2 864; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 865; LMULMAX2-RV64-NEXT: vadd.vv v26, v28, v26 866; LMULMAX2-RV64-NEXT: vsrl.vi v28, v26, 4 867; LMULMAX2-RV64-NEXT: vadd.vv v26, v26, v28 868; LMULMAX2-RV64-NEXT: lui a1, 3855 869; LMULMAX2-RV64-NEXT: addiw a1, a1, 241 870; LMULMAX2-RV64-NEXT: slli a1, a1, 12 871; LMULMAX2-RV64-NEXT: addi a1, a1, -241 872; LMULMAX2-RV64-NEXT: slli a1, a1, 12 873; LMULMAX2-RV64-NEXT: addi a1, a1, 241 874; LMULMAX2-RV64-NEXT: slli a1, a1, 12 875; LMULMAX2-RV64-NEXT: addi a1, a1, -241 876; LMULMAX2-RV64-NEXT: vand.vx v26, v26, a1 877; LMULMAX2-RV64-NEXT: lui a1, 4112 878; LMULMAX2-RV64-NEXT: addiw a1, a1, 257 879; LMULMAX2-RV64-NEXT: slli a1, a1, 16 880; LMULMAX2-RV64-NEXT: addi a1, a1, 257 881; LMULMAX2-RV64-NEXT: slli a1, a1, 16 882; LMULMAX2-RV64-NEXT: addi a1, a1, 257 883; LMULMAX2-RV64-NEXT: vmul.vx v26, v26, a1 884; LMULMAX2-RV64-NEXT: addi a1, zero, 56 885; LMULMAX2-RV64-NEXT: vsrl.vx v26, v26, a1 886; LMULMAX2-RV64-NEXT: vse64.v v26, (a0) 887; LMULMAX2-RV64-NEXT: ret 888; 889; LMULMAX1-RV32-LABEL: ctpop_v4i64: 890; LMULMAX1-RV32: # %bb.0: 891; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 892; LMULMAX1-RV32-NEXT: addi a1, a0, 16 893; LMULMAX1-RV32-NEXT: vle64.v v25, (a1) 894; LMULMAX1-RV32-NEXT: vle64.v v26, (a0) 895; LMULMAX1-RV32-NEXT: vsrl.vi v27, v25, 1 896; LMULMAX1-RV32-NEXT: lui a2, 349525 897; LMULMAX1-RV32-NEXT: addi a2, a2, 1365 898; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 899; LMULMAX1-RV32-NEXT: vmv.v.x v28, a2 900; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 901; LMULMAX1-RV32-NEXT: vand.vv v27, v27, v28 902; LMULMAX1-RV32-NEXT: vsub.vv v25, v25, v27 903; LMULMAX1-RV32-NEXT: lui a2, 209715 904; LMULMAX1-RV32-NEXT: addi a2, a2, 819 905; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 906; LMULMAX1-RV32-NEXT: vmv.v.x v27, a2 907; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 908; LMULMAX1-RV32-NEXT: vand.vv v29, v25, v27 909; LMULMAX1-RV32-NEXT: vsrl.vi v25, v25, 2 910; LMULMAX1-RV32-NEXT: vand.vv v25, v25, v27 911; LMULMAX1-RV32-NEXT: vadd.vv v25, v29, v25 912; LMULMAX1-RV32-NEXT: vsrl.vi v29, v25, 4 913; LMULMAX1-RV32-NEXT: vadd.vv v25, v25, v29 914; LMULMAX1-RV32-NEXT: lui a2, 61681 915; LMULMAX1-RV32-NEXT: addi a2, a2, -241 916; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 917; LMULMAX1-RV32-NEXT: vmv.v.x v29, a2 918; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 919; LMULMAX1-RV32-NEXT: vand.vv v25, v25, v29 920; LMULMAX1-RV32-NEXT: lui a2, 4112 921; LMULMAX1-RV32-NEXT: addi a2, a2, 257 922; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu 923; LMULMAX1-RV32-NEXT: vmv.v.x v30, a2 924; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu 925; LMULMAX1-RV32-NEXT: vmul.vv v25, v25, v30 926; LMULMAX1-RV32-NEXT: addi a2, zero, 56 927; LMULMAX1-RV32-NEXT: vsrl.vx v25, v25, a2 928; LMULMAX1-RV32-NEXT: vsrl.vi v31, v26, 1 929; LMULMAX1-RV32-NEXT: vand.vv v28, v31, v28 930; LMULMAX1-RV32-NEXT: vsub.vv v26, v26, v28 931; LMULMAX1-RV32-NEXT: vand.vv v28, v26, v27 932; LMULMAX1-RV32-NEXT: vsrl.vi v26, v26, 2 933; LMULMAX1-RV32-NEXT: vand.vv v26, v26, v27 934; LMULMAX1-RV32-NEXT: vadd.vv v26, v28, v26 935; LMULMAX1-RV32-NEXT: vsrl.vi v27, v26, 4 936; LMULMAX1-RV32-NEXT: vadd.vv v26, v26, v27 937; LMULMAX1-RV32-NEXT: vand.vv v26, v26, v29 938; LMULMAX1-RV32-NEXT: vmul.vv v26, v26, v30 939; LMULMAX1-RV32-NEXT: vsrl.vx v26, v26, a2 940; LMULMAX1-RV32-NEXT: vse64.v v26, (a0) 941; LMULMAX1-RV32-NEXT: vse64.v v25, (a1) 942; LMULMAX1-RV32-NEXT: ret 943; 944; LMULMAX1-RV64-LABEL: ctpop_v4i64: 945; LMULMAX1-RV64: # %bb.0: 946; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu 947; LMULMAX1-RV64-NEXT: addi a6, a0, 16 948; LMULMAX1-RV64-NEXT: vle64.v v25, (a6) 949; LMULMAX1-RV64-NEXT: vle64.v v26, (a0) 950; LMULMAX1-RV64-NEXT: vsrl.vi v27, v25, 1 951; LMULMAX1-RV64-NEXT: lui a2, 21845 952; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 953; LMULMAX1-RV64-NEXT: slli a2, a2, 12 954; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 955; LMULMAX1-RV64-NEXT: slli a2, a2, 12 956; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 957; LMULMAX1-RV64-NEXT: slli a2, a2, 12 958; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 959; LMULMAX1-RV64-NEXT: vand.vx v27, v27, a2 960; LMULMAX1-RV64-NEXT: vsub.vv v25, v25, v27 961; LMULMAX1-RV64-NEXT: lui a3, 13107 962; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 963; LMULMAX1-RV64-NEXT: slli a3, a3, 12 964; LMULMAX1-RV64-NEXT: addi a3, a3, 819 965; LMULMAX1-RV64-NEXT: slli a3, a3, 12 966; LMULMAX1-RV64-NEXT: addi a3, a3, 819 967; LMULMAX1-RV64-NEXT: slli a3, a3, 12 968; LMULMAX1-RV64-NEXT: addi a3, a3, 819 969; LMULMAX1-RV64-NEXT: vand.vx v27, v25, a3 970; LMULMAX1-RV64-NEXT: vsrl.vi v25, v25, 2 971; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a3 972; LMULMAX1-RV64-NEXT: vadd.vv v25, v27, v25 973; LMULMAX1-RV64-NEXT: vsrl.vi v27, v25, 4 974; LMULMAX1-RV64-NEXT: vadd.vv v25, v25, v27 975; LMULMAX1-RV64-NEXT: lui a4, 3855 976; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 977; LMULMAX1-RV64-NEXT: slli a4, a4, 12 978; LMULMAX1-RV64-NEXT: addi a4, a4, -241 979; LMULMAX1-RV64-NEXT: slli a4, a4, 12 980; LMULMAX1-RV64-NEXT: addi a4, a4, 241 981; LMULMAX1-RV64-NEXT: slli a4, a4, 12 982; LMULMAX1-RV64-NEXT: addi a4, a4, -241 983; LMULMAX1-RV64-NEXT: vand.vx v25, v25, a4 984; LMULMAX1-RV64-NEXT: lui a5, 4112 985; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 986; LMULMAX1-RV64-NEXT: slli a5, a5, 16 987; LMULMAX1-RV64-NEXT: addi a5, a5, 257 988; LMULMAX1-RV64-NEXT: slli a5, a5, 16 989; LMULMAX1-RV64-NEXT: addi a5, a5, 257 990; LMULMAX1-RV64-NEXT: vmul.vx v25, v25, a5 991; LMULMAX1-RV64-NEXT: addi a1, zero, 56 992; LMULMAX1-RV64-NEXT: vsrl.vx v25, v25, a1 993; LMULMAX1-RV64-NEXT: vsrl.vi v27, v26, 1 994; LMULMAX1-RV64-NEXT: vand.vx v27, v27, a2 995; LMULMAX1-RV64-NEXT: vsub.vv v26, v26, v27 996; LMULMAX1-RV64-NEXT: vand.vx v27, v26, a3 997; LMULMAX1-RV64-NEXT: vsrl.vi v26, v26, 2 998; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a3 999; LMULMAX1-RV64-NEXT: vadd.vv v26, v27, v26 1000; LMULMAX1-RV64-NEXT: vsrl.vi v27, v26, 4 1001; LMULMAX1-RV64-NEXT: vadd.vv v26, v26, v27 1002; LMULMAX1-RV64-NEXT: vand.vx v26, v26, a4 1003; LMULMAX1-RV64-NEXT: vmul.vx v26, v26, a5 1004; LMULMAX1-RV64-NEXT: vsrl.vx v26, v26, a1 1005; LMULMAX1-RV64-NEXT: vse64.v v26, (a0) 1006; LMULMAX1-RV64-NEXT: vse64.v v25, (a6) 1007; LMULMAX1-RV64-NEXT: ret 1008 %a = load <4 x i64>, <4 x i64>* %x 1009 %b = load <4 x i64>, <4 x i64>* %y 1010 %c = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a) 1011 store <4 x i64> %c, <4 x i64>* %x 1012 ret void 1013} 1014declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>) 1015