1; RUN: llc < %s -mtriple=ve -mattr=+vpu | FileCheck %s 2 3;;; Test vector population count intrinsic instructions 4;;; 5;;; Note: 6;;; We test VPCNT*vl, VPCNT*vl_v, VPCNT*vml_v, PVPCNT*vl, PVPCNT*vl_v, PVPCNT*vml_v instructions. 7 8; Function Attrs: nounwind readnone 9define fastcc <256 x double> @vpcnt_vvl(<256 x double> %0) { 10; CHECK-LABEL: vpcnt_vvl: 11; CHECK: # %bb.0: 12; CHECK-NEXT: lea %s0, 256 13; CHECK-NEXT: lvl %s0 14; CHECK-NEXT: vpcnt %v0, %v0 15; CHECK-NEXT: b.l.t (, %s10) 16 %2 = tail call fast <256 x double> @llvm.ve.vl.vpcnt.vvl(<256 x double> %0, i32 256) 17 ret <256 x double> %2 18} 19 20; Function Attrs: nounwind readnone 21declare <256 x double> @llvm.ve.vl.vpcnt.vvl(<256 x double>, i32) 22 23; Function Attrs: nounwind readnone 24define fastcc <256 x double> @vpcnt_vvvl(<256 x double> %0, <256 x double> %1) { 25; CHECK-LABEL: vpcnt_vvvl: 26; CHECK: # %bb.0: 27; CHECK-NEXT: lea %s0, 128 28; CHECK-NEXT: lvl %s0 29; CHECK-NEXT: vpcnt %v1, %v0 30; CHECK-NEXT: lea %s16, 256 31; CHECK-NEXT: lvl %s16 32; CHECK-NEXT: vor %v0, (0)1, %v1 33; CHECK-NEXT: b.l.t (, %s10) 34 %3 = tail call fast <256 x double> @llvm.ve.vl.vpcnt.vvvl(<256 x double> %0, <256 x double> %1, i32 128) 35 ret <256 x double> %3 36} 37 38; Function Attrs: nounwind readnone 39declare <256 x double> @llvm.ve.vl.vpcnt.vvvl(<256 x double>, <256 x double>, i32) 40 41; Function Attrs: nounwind readnone 42define fastcc <256 x double> @vpcnt_vvmvl(<256 x double> %0, <256 x i1> %1, <256 x double> %2) { 43; CHECK-LABEL: vpcnt_vvmvl: 44; CHECK: # %bb.0: 45; CHECK-NEXT: lea %s0, 128 46; CHECK-NEXT: lvl %s0 47; CHECK-NEXT: vpcnt %v1, %v0, %vm1 48; CHECK-NEXT: lea %s16, 256 49; CHECK-NEXT: lvl %s16 50; CHECK-NEXT: vor %v0, (0)1, %v1 51; CHECK-NEXT: b.l.t (, %s10) 52 %4 = tail call fast <256 x double> @llvm.ve.vl.vpcnt.vvmvl(<256 x double> %0, <256 x i1> %1, <256 x double> %2, i32 128) 53 ret <256 x double> %4 54} 55 56; Function Attrs: nounwind readnone 57declare <256 x double> @llvm.ve.vl.vpcnt.vvmvl(<256 x double>, <256 x i1>, <256 x double>, i32) 58 59; Function Attrs: nounwind readnone 60define fastcc <256 x double> @pvpcntlo_vvl(<256 x double> %0) { 61; CHECK-LABEL: pvpcntlo_vvl: 62; CHECK: # %bb.0: 63; CHECK-NEXT: lea %s0, 256 64; CHECK-NEXT: lvl %s0 65; CHECK-NEXT: pvpcnt.lo %v0, %v0 66; CHECK-NEXT: b.l.t (, %s10) 67 %2 = tail call fast <256 x double> @llvm.ve.vl.pvpcntlo.vvl(<256 x double> %0, i32 256) 68 ret <256 x double> %2 69} 70 71; Function Attrs: nounwind readnone 72declare <256 x double> @llvm.ve.vl.pvpcntlo.vvl(<256 x double>, i32) 73 74; Function Attrs: nounwind readnone 75define fastcc <256 x double> @pvpcntlo_vvvl(<256 x double> %0, <256 x double> %1) { 76; CHECK-LABEL: pvpcntlo_vvvl: 77; CHECK: # %bb.0: 78; CHECK-NEXT: lea %s0, 128 79; CHECK-NEXT: lvl %s0 80; CHECK-NEXT: pvpcnt.lo %v1, %v0 81; CHECK-NEXT: lea %s16, 256 82; CHECK-NEXT: lvl %s16 83; CHECK-NEXT: vor %v0, (0)1, %v1 84; CHECK-NEXT: b.l.t (, %s10) 85 %3 = tail call fast <256 x double> @llvm.ve.vl.pvpcntlo.vvvl(<256 x double> %0, <256 x double> %1, i32 128) 86 ret <256 x double> %3 87} 88 89; Function Attrs: nounwind readnone 90declare <256 x double> @llvm.ve.vl.pvpcntlo.vvvl(<256 x double>, <256 x double>, i32) 91 92; Function Attrs: nounwind readnone 93define fastcc <256 x double> @pvpcntlo_vvmvl(<256 x double> %0, <256 x i1> %1, <256 x double> %2) { 94; CHECK-LABEL: pvpcntlo_vvmvl: 95; CHECK: # %bb.0: 96; CHECK-NEXT: lea %s0, 128 97; CHECK-NEXT: lvl %s0 98; CHECK-NEXT: pvpcnt.lo %v1, %v0, %vm1 99; CHECK-NEXT: lea %s16, 256 100; CHECK-NEXT: lvl %s16 101; CHECK-NEXT: vor %v0, (0)1, %v1 102; CHECK-NEXT: b.l.t (, %s10) 103 %4 = tail call fast <256 x double> @llvm.ve.vl.pvpcntlo.vvmvl(<256 x double> %0, <256 x i1> %1, <256 x double> %2, i32 128) 104 ret <256 x double> %4 105} 106 107; Function Attrs: nounwind readnone 108declare <256 x double> @llvm.ve.vl.pvpcntlo.vvmvl(<256 x double>, <256 x i1>, <256 x double>, i32) 109 110; Function Attrs: nounwind readnone 111define fastcc <256 x double> @pvpcntup_vvl(<256 x double> %0) { 112; CHECK-LABEL: pvpcntup_vvl: 113; CHECK: # %bb.0: 114; CHECK-NEXT: lea %s0, 256 115; CHECK-NEXT: lvl %s0 116; CHECK-NEXT: pvpcnt.up %v0, %v0 117; CHECK-NEXT: b.l.t (, %s10) 118 %2 = tail call fast <256 x double> @llvm.ve.vl.pvpcntup.vvl(<256 x double> %0, i32 256) 119 ret <256 x double> %2 120} 121 122; Function Attrs: nounwind readnone 123declare <256 x double> @llvm.ve.vl.pvpcntup.vvl(<256 x double>, i32) 124 125; Function Attrs: nounwind readnone 126define fastcc <256 x double> @pvpcntup_vvvl(<256 x double> %0, <256 x double> %1) { 127; CHECK-LABEL: pvpcntup_vvvl: 128; CHECK: # %bb.0: 129; CHECK-NEXT: lea %s0, 128 130; CHECK-NEXT: lvl %s0 131; CHECK-NEXT: pvpcnt.up %v1, %v0 132; CHECK-NEXT: lea %s16, 256 133; CHECK-NEXT: lvl %s16 134; CHECK-NEXT: vor %v0, (0)1, %v1 135; CHECK-NEXT: b.l.t (, %s10) 136 %3 = tail call fast <256 x double> @llvm.ve.vl.pvpcntup.vvvl(<256 x double> %0, <256 x double> %1, i32 128) 137 ret <256 x double> %3 138} 139 140; Function Attrs: nounwind readnone 141declare <256 x double> @llvm.ve.vl.pvpcntup.vvvl(<256 x double>, <256 x double>, i32) 142 143; Function Attrs: nounwind readnone 144define fastcc <256 x double> @pvpcntup_vvmvl(<256 x double> %0, <256 x i1> %1, <256 x double> %2) { 145; CHECK-LABEL: pvpcntup_vvmvl: 146; CHECK: # %bb.0: 147; CHECK-NEXT: lea %s0, 128 148; CHECK-NEXT: lvl %s0 149; CHECK-NEXT: pvpcnt.up %v1, %v0, %vm1 150; CHECK-NEXT: lea %s16, 256 151; CHECK-NEXT: lvl %s16 152; CHECK-NEXT: vor %v0, (0)1, %v1 153; CHECK-NEXT: b.l.t (, %s10) 154 %4 = tail call fast <256 x double> @llvm.ve.vl.pvpcntup.vvmvl(<256 x double> %0, <256 x i1> %1, <256 x double> %2, i32 128) 155 ret <256 x double> %4 156} 157 158; Function Attrs: nounwind readnone 159declare <256 x double> @llvm.ve.vl.pvpcntup.vvmvl(<256 x double>, <256 x i1>, <256 x double>, i32) 160 161; Function Attrs: nounwind readnone 162define fastcc <256 x double> @pvpcnt_vvl(<256 x double> %0) { 163; CHECK-LABEL: pvpcnt_vvl: 164; CHECK: # %bb.0: 165; CHECK-NEXT: lea %s0, 256 166; CHECK-NEXT: lvl %s0 167; CHECK-NEXT: pvpcnt %v0, %v0 168; CHECK-NEXT: b.l.t (, %s10) 169 %2 = tail call fast <256 x double> @llvm.ve.vl.pvpcnt.vvl(<256 x double> %0, i32 256) 170 ret <256 x double> %2 171} 172 173; Function Attrs: nounwind readnone 174declare <256 x double> @llvm.ve.vl.pvpcnt.vvl(<256 x double>, i32) 175 176; Function Attrs: nounwind readnone 177define fastcc <256 x double> @pvpcnt_vvvl(<256 x double> %0, <256 x double> %1) { 178; CHECK-LABEL: pvpcnt_vvvl: 179; CHECK: # %bb.0: 180; CHECK-NEXT: lea %s0, 128 181; CHECK-NEXT: lvl %s0 182; CHECK-NEXT: pvpcnt %v1, %v0 183; CHECK-NEXT: lea %s16, 256 184; CHECK-NEXT: lvl %s16 185; CHECK-NEXT: vor %v0, (0)1, %v1 186; CHECK-NEXT: b.l.t (, %s10) 187 %3 = tail call fast <256 x double> @llvm.ve.vl.pvpcnt.vvvl(<256 x double> %0, <256 x double> %1, i32 128) 188 ret <256 x double> %3 189} 190 191; Function Attrs: nounwind readnone 192declare <256 x double> @llvm.ve.vl.pvpcnt.vvvl(<256 x double>, <256 x double>, i32) 193 194; Function Attrs: nounwind readnone 195define fastcc <256 x double> @pvpcnt_vvMvl(<256 x double> %0, <512 x i1> %1, <256 x double> %2) { 196; CHECK-LABEL: pvpcnt_vvMvl: 197; CHECK: # %bb.0: 198; CHECK-NEXT: lea %s0, 128 199; CHECK-NEXT: lvl %s0 200; CHECK-NEXT: pvpcnt %v1, %v0, %vm2 201; CHECK-NEXT: lea %s16, 256 202; CHECK-NEXT: lvl %s16 203; CHECK-NEXT: vor %v0, (0)1, %v1 204; CHECK-NEXT: b.l.t (, %s10) 205 %4 = tail call fast <256 x double> @llvm.ve.vl.pvpcnt.vvMvl(<256 x double> %0, <512 x i1> %1, <256 x double> %2, i32 128) 206 ret <256 x double> %4 207} 208 209; Function Attrs: nounwind readnone 210declare <256 x double> @llvm.ve.vl.pvpcnt.vvMvl(<256 x double>, <512 x i1>, <256 x double>, i32) 211