1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+m,+zvfh,+v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s 4; RUN: llc -mtriple=riscv64 -mattr=+d,+m,+zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s 6; RUN: llc -mtriple=riscv32 -mattr=+d,+m,+zvfhmin,+v -target-abi=ilp32d \ 7; RUN: -verify-machineinstrs < %s | FileCheck %s 8; RUN: llc -mtriple=riscv64 -mattr=+d,+m,+zvfhmin,+v -target-abi=lp64d \ 9; RUN: -verify-machineinstrs < %s | FileCheck %s 10 11declare <vscale x 1 x i1> @llvm.vp.select.nxv1i1(<vscale x 1 x i1>, <vscale x 1 x i1>, <vscale x 1 x i1>, i32) 12 13define <vscale x 1 x i1> @select_nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i1> %c, i32 zeroext %evl) { 14; CHECK-LABEL: select_nxv1i1: 15; CHECK: # %bb.0: 16; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 17; CHECK-NEXT: vmandn.mm v9, v9, v0 18; CHECK-NEXT: vmand.mm v8, v8, v0 19; CHECK-NEXT: vmor.mm v0, v8, v9 20; CHECK-NEXT: ret 21 %v = call <vscale x 1 x i1> @llvm.vp.select.nxv1i1(<vscale x 1 x i1> %a, <vscale x 1 x i1> %b, <vscale x 1 x i1> %c, i32 %evl) 22 ret <vscale x 1 x i1> %v 23} 24 25declare <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1>, <vscale x 2 x i1>, <vscale x 2 x i1>, i32) 26 27define <vscale x 2 x i1> @select_nxv2i1(<vscale x 2 x i1> %a, <vscale x 2 x i1> %b, <vscale x 2 x i1> %c, i32 zeroext %evl) { 28; CHECK-LABEL: select_nxv2i1: 29; CHECK: # %bb.0: 30; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 31; CHECK-NEXT: vmandn.mm v9, v9, v0 32; CHECK-NEXT: vmand.mm v8, v8, v0 33; CHECK-NEXT: vmor.mm v0, v8, v9 34; CHECK-NEXT: ret 35 %v = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %a, <vscale x 2 x i1> %b, <vscale x 2 x i1> %c, i32 %evl) 36 ret <vscale x 2 x i1> %v 37} 38 39declare <vscale x 4 x i1> @llvm.vp.select.nxv4i1(<vscale x 4 x i1>, <vscale x 4 x i1>, <vscale x 4 x i1>, i32) 40 41define <vscale x 4 x i1> @select_nxv4i1(<vscale x 4 x i1> %a, <vscale x 4 x i1> %b, <vscale x 4 x i1> %c, i32 zeroext %evl) { 42; CHECK-LABEL: select_nxv4i1: 43; CHECK: # %bb.0: 44; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 45; CHECK-NEXT: vmandn.mm v9, v9, v0 46; CHECK-NEXT: vmand.mm v8, v8, v0 47; CHECK-NEXT: vmor.mm v0, v8, v9 48; CHECK-NEXT: ret 49 %v = call <vscale x 4 x i1> @llvm.vp.select.nxv4i1(<vscale x 4 x i1> %a, <vscale x 4 x i1> %b, <vscale x 4 x i1> %c, i32 %evl) 50 ret <vscale x 4 x i1> %v 51} 52 53declare <vscale x 8 x i1> @llvm.vp.select.nxv8i1(<vscale x 8 x i1>, <vscale x 8 x i1>, <vscale x 8 x i1>, i32) 54 55define <vscale x 8 x i1> @select_nxv8i1(<vscale x 8 x i1> %a, <vscale x 8 x i1> %b, <vscale x 8 x i1> %c, i32 zeroext %evl) { 56; CHECK-LABEL: select_nxv8i1: 57; CHECK: # %bb.0: 58; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 59; CHECK-NEXT: vmandn.mm v9, v9, v0 60; CHECK-NEXT: vmand.mm v8, v8, v0 61; CHECK-NEXT: vmor.mm v0, v8, v9 62; CHECK-NEXT: ret 63 %v = call <vscale x 8 x i1> @llvm.vp.select.nxv8i1(<vscale x 8 x i1> %a, <vscale x 8 x i1> %b, <vscale x 8 x i1> %c, i32 %evl) 64 ret <vscale x 8 x i1> %v 65} 66 67declare <vscale x 16 x i1> @llvm.vp.select.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>, i32) 68 69define <vscale x 16 x i1> @select_nxv16i1(<vscale x 16 x i1> %a, <vscale x 16 x i1> %b, <vscale x 16 x i1> %c, i32 zeroext %evl) { 70; CHECK-LABEL: select_nxv16i1: 71; CHECK: # %bb.0: 72; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 73; CHECK-NEXT: vmandn.mm v9, v9, v0 74; CHECK-NEXT: vmand.mm v8, v8, v0 75; CHECK-NEXT: vmor.mm v0, v8, v9 76; CHECK-NEXT: ret 77 %v = call <vscale x 16 x i1> @llvm.vp.select.nxv16i1(<vscale x 16 x i1> %a, <vscale x 16 x i1> %b, <vscale x 16 x i1> %c, i32 %evl) 78 ret <vscale x 16 x i1> %v 79} 80 81declare <vscale x 32 x i1> @llvm.vp.select.nxv32i1(<vscale x 32 x i1>, <vscale x 32 x i1>, <vscale x 32 x i1>, i32) 82 83define <vscale x 32 x i1> @select_nxv32i1(<vscale x 32 x i1> %a, <vscale x 32 x i1> %b, <vscale x 32 x i1> %c, i32 zeroext %evl) { 84; CHECK-LABEL: select_nxv32i1: 85; CHECK: # %bb.0: 86; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma 87; CHECK-NEXT: vmandn.mm v9, v9, v0 88; CHECK-NEXT: vmand.mm v8, v8, v0 89; CHECK-NEXT: vmor.mm v0, v8, v9 90; CHECK-NEXT: ret 91 %v = call <vscale x 32 x i1> @llvm.vp.select.nxv32i1(<vscale x 32 x i1> %a, <vscale x 32 x i1> %b, <vscale x 32 x i1> %c, i32 %evl) 92 ret <vscale x 32 x i1> %v 93} 94 95declare <vscale x 64 x i1> @llvm.vp.select.nxv64i1(<vscale x 64 x i1>, <vscale x 64 x i1>, <vscale x 64 x i1>, i32) 96 97define <vscale x 64 x i1> @select_nxv64i1(<vscale x 64 x i1> %a, <vscale x 64 x i1> %b, <vscale x 64 x i1> %c, i32 zeroext %evl) { 98; CHECK-LABEL: select_nxv64i1: 99; CHECK: # %bb.0: 100; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 101; CHECK-NEXT: vmandn.mm v9, v9, v0 102; CHECK-NEXT: vmand.mm v8, v8, v0 103; CHECK-NEXT: vmor.mm v0, v8, v9 104; CHECK-NEXT: ret 105 %v = call <vscale x 64 x i1> @llvm.vp.select.nxv64i1(<vscale x 64 x i1> %a, <vscale x 64 x i1> %b, <vscale x 64 x i1> %c, i32 %evl) 106 ret <vscale x 64 x i1> %v 107} 108 109declare <vscale x 8 x i7> @llvm.vp.select.nxv8i7(<vscale x 8 x i1>, <vscale x 8 x i7>, <vscale x 8 x i7>, i32) 110 111define <vscale x 8 x i7> @select_nxv8i7(<vscale x 8 x i1> %a, <vscale x 8 x i7> %b, <vscale x 8 x i7> %c, i32 zeroext %evl) { 112; CHECK-LABEL: select_nxv8i7: 113; CHECK: # %bb.0: 114; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 115; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 116; CHECK-NEXT: ret 117 %v = call <vscale x 8 x i7> @llvm.vp.select.nxv8i7(<vscale x 8 x i1> %a, <vscale x 8 x i7> %b, <vscale x 8 x i7> %c, i32 %evl) 118 ret <vscale x 8 x i7> %v 119} 120 121declare <vscale x 1 x i8> @llvm.vp.select.nxv1i8(<vscale x 1 x i1>, <vscale x 1 x i8>, <vscale x 1 x i8>, i32) 122 123define <vscale x 1 x i8> @select_nxv1i8(<vscale x 1 x i1> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, i32 zeroext %evl) { 124; CHECK-LABEL: select_nxv1i8: 125; CHECK: # %bb.0: 126; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 127; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 128; CHECK-NEXT: ret 129 %v = call <vscale x 1 x i8> @llvm.vp.select.nxv1i8(<vscale x 1 x i1> %a, <vscale x 1 x i8> %b, <vscale x 1 x i8> %c, i32 %evl) 130 ret <vscale x 1 x i8> %v 131} 132 133declare <vscale x 2 x i8> @llvm.vp.select.nxv2i8(<vscale x 2 x i1>, <vscale x 2 x i8>, <vscale x 2 x i8>, i32) 134 135define <vscale x 2 x i8> @select_nxv2i8(<vscale x 2 x i1> %a, <vscale x 2 x i8> %b, <vscale x 2 x i8> %c, i32 zeroext %evl) { 136; CHECK-LABEL: select_nxv2i8: 137; CHECK: # %bb.0: 138; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 139; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 140; CHECK-NEXT: ret 141 %v = call <vscale x 2 x i8> @llvm.vp.select.nxv2i8(<vscale x 2 x i1> %a, <vscale x 2 x i8> %b, <vscale x 2 x i8> %c, i32 %evl) 142 ret <vscale x 2 x i8> %v 143} 144 145declare <vscale x 4 x i8> @llvm.vp.select.nxv4i8(<vscale x 4 x i1>, <vscale x 4 x i8>, <vscale x 4 x i8>, i32) 146 147define <vscale x 4 x i8> @select_nxv4i8(<vscale x 4 x i1> %a, <vscale x 4 x i8> %b, <vscale x 4 x i8> %c, i32 zeroext %evl) { 148; CHECK-LABEL: select_nxv4i8: 149; CHECK: # %bb.0: 150; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 151; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 152; CHECK-NEXT: ret 153 %v = call <vscale x 4 x i8> @llvm.vp.select.nxv4i8(<vscale x 4 x i1> %a, <vscale x 4 x i8> %b, <vscale x 4 x i8> %c, i32 %evl) 154 ret <vscale x 4 x i8> %v 155} 156 157declare <vscale x 8 x i8> @llvm.vp.select.nxv8i8(<vscale x 8 x i1>, <vscale x 8 x i8>, <vscale x 8 x i8>, i32) 158 159define <vscale x 8 x i8> @select_nxv8i8(<vscale x 8 x i1> %a, <vscale x 8 x i8> %b, <vscale x 8 x i8> %c, i32 zeroext %evl) { 160; CHECK-LABEL: select_nxv8i8: 161; CHECK: # %bb.0: 162; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 163; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 164; CHECK-NEXT: ret 165 %v = call <vscale x 8 x i8> @llvm.vp.select.nxv8i8(<vscale x 8 x i1> %a, <vscale x 8 x i8> %b, <vscale x 8 x i8> %c, i32 %evl) 166 ret <vscale x 8 x i8> %v 167} 168 169declare <vscale x 14 x i8> @llvm.vp.select.nxv14i8(<vscale x 14 x i1>, <vscale x 14 x i8>, <vscale x 14 x i8>, i32) 170 171define <vscale x 14 x i8> @select_nxv14i8(<vscale x 14 x i1> %a, <vscale x 14 x i8> %b, <vscale x 14 x i8> %c, i32 zeroext %evl) { 172; CHECK-LABEL: select_nxv14i8: 173; CHECK: # %bb.0: 174; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 175; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 176; CHECK-NEXT: ret 177 %v = call <vscale x 14 x i8> @llvm.vp.select.nxv14i8(<vscale x 14 x i1> %a, <vscale x 14 x i8> %b, <vscale x 14 x i8> %c, i32 %evl) 178 ret <vscale x 14 x i8> %v 179} 180 181declare <vscale x 16 x i8> @llvm.vp.select.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32) 182 183define <vscale x 16 x i8> @select_nxv16i8(<vscale x 16 x i1> %a, <vscale x 16 x i8> %b, <vscale x 16 x i8> %c, i32 zeroext %evl) { 184; CHECK-LABEL: select_nxv16i8: 185; CHECK: # %bb.0: 186; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 187; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 188; CHECK-NEXT: ret 189 %v = call <vscale x 16 x i8> @llvm.vp.select.nxv16i8(<vscale x 16 x i1> %a, <vscale x 16 x i8> %b, <vscale x 16 x i8> %c, i32 %evl) 190 ret <vscale x 16 x i8> %v 191} 192 193declare <vscale x 32 x i8> @llvm.vp.select.nxv32i8(<vscale x 32 x i1>, <vscale x 32 x i8>, <vscale x 32 x i8>, i32) 194 195define <vscale x 32 x i8> @select_nxv32i8(<vscale x 32 x i1> %a, <vscale x 32 x i8> %b, <vscale x 32 x i8> %c, i32 zeroext %evl) { 196; CHECK-LABEL: select_nxv32i8: 197; CHECK: # %bb.0: 198; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma 199; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 200; CHECK-NEXT: ret 201 %v = call <vscale x 32 x i8> @llvm.vp.select.nxv32i8(<vscale x 32 x i1> %a, <vscale x 32 x i8> %b, <vscale x 32 x i8> %c, i32 %evl) 202 ret <vscale x 32 x i8> %v 203} 204 205declare <vscale x 64 x i8> @llvm.vp.select.nxv64i8(<vscale x 64 x i1>, <vscale x 64 x i8>, <vscale x 64 x i8>, i32) 206 207define <vscale x 64 x i8> @select_nxv64i8(<vscale x 64 x i1> %a, <vscale x 64 x i8> %b, <vscale x 64 x i8> %c, i32 zeroext %evl) { 208; CHECK-LABEL: select_nxv64i8: 209; CHECK: # %bb.0: 210; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 211; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 212; CHECK-NEXT: ret 213 %v = call <vscale x 64 x i8> @llvm.vp.select.nxv64i8(<vscale x 64 x i1> %a, <vscale x 64 x i8> %b, <vscale x 64 x i8> %c, i32 %evl) 214 ret <vscale x 64 x i8> %v 215} 216 217declare <vscale x 1 x i16> @llvm.vp.select.nxv1i16(<vscale x 1 x i1>, <vscale x 1 x i16>, <vscale x 1 x i16>, i32) 218 219define <vscale x 1 x i16> @select_nxv1i16(<vscale x 1 x i1> %a, <vscale x 1 x i16> %b, <vscale x 1 x i16> %c, i32 zeroext %evl) { 220; CHECK-LABEL: select_nxv1i16: 221; CHECK: # %bb.0: 222; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 223; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 224; CHECK-NEXT: ret 225 %v = call <vscale x 1 x i16> @llvm.vp.select.nxv1i16(<vscale x 1 x i1> %a, <vscale x 1 x i16> %b, <vscale x 1 x i16> %c, i32 %evl) 226 ret <vscale x 1 x i16> %v 227} 228 229declare <vscale x 2 x i16> @llvm.vp.select.nxv2i16(<vscale x 2 x i1>, <vscale x 2 x i16>, <vscale x 2 x i16>, i32) 230 231define <vscale x 2 x i16> @select_nxv2i16(<vscale x 2 x i1> %a, <vscale x 2 x i16> %b, <vscale x 2 x i16> %c, i32 zeroext %evl) { 232; CHECK-LABEL: select_nxv2i16: 233; CHECK: # %bb.0: 234; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 235; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 236; CHECK-NEXT: ret 237 %v = call <vscale x 2 x i16> @llvm.vp.select.nxv2i16(<vscale x 2 x i1> %a, <vscale x 2 x i16> %b, <vscale x 2 x i16> %c, i32 %evl) 238 ret <vscale x 2 x i16> %v 239} 240 241declare <vscale x 4 x i16> @llvm.vp.select.nxv4i16(<vscale x 4 x i1>, <vscale x 4 x i16>, <vscale x 4 x i16>, i32) 242 243define <vscale x 4 x i16> @select_nxv4i16(<vscale x 4 x i1> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, i32 zeroext %evl) { 244; CHECK-LABEL: select_nxv4i16: 245; CHECK: # %bb.0: 246; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 247; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 248; CHECK-NEXT: ret 249 %v = call <vscale x 4 x i16> @llvm.vp.select.nxv4i16(<vscale x 4 x i1> %a, <vscale x 4 x i16> %b, <vscale x 4 x i16> %c, i32 %evl) 250 ret <vscale x 4 x i16> %v 251} 252 253declare <vscale x 8 x i16> @llvm.vp.select.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32) 254 255define <vscale x 8 x i16> @select_nxv8i16(<vscale x 8 x i1> %a, <vscale x 8 x i16> %b, <vscale x 8 x i16> %c, i32 zeroext %evl) { 256; CHECK-LABEL: select_nxv8i16: 257; CHECK: # %bb.0: 258; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 259; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 260; CHECK-NEXT: ret 261 %v = call <vscale x 8 x i16> @llvm.vp.select.nxv8i16(<vscale x 8 x i1> %a, <vscale x 8 x i16> %b, <vscale x 8 x i16> %c, i32 %evl) 262 ret <vscale x 8 x i16> %v 263} 264 265declare <vscale x 16 x i16> @llvm.vp.select.nxv16i16(<vscale x 16 x i1>, <vscale x 16 x i16>, <vscale x 16 x i16>, i32) 266 267define <vscale x 16 x i16> @select_nxv16i16(<vscale x 16 x i1> %a, <vscale x 16 x i16> %b, <vscale x 16 x i16> %c, i32 zeroext %evl) { 268; CHECK-LABEL: select_nxv16i16: 269; CHECK: # %bb.0: 270; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 271; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 272; CHECK-NEXT: ret 273 %v = call <vscale x 16 x i16> @llvm.vp.select.nxv16i16(<vscale x 16 x i1> %a, <vscale x 16 x i16> %b, <vscale x 16 x i16> %c, i32 %evl) 274 ret <vscale x 16 x i16> %v 275} 276 277declare <vscale x 32 x i16> @llvm.vp.select.nxv32i16(<vscale x 32 x i1>, <vscale x 32 x i16>, <vscale x 32 x i16>, i32) 278 279define <vscale x 32 x i16> @select_nxv32i16(<vscale x 32 x i1> %a, <vscale x 32 x i16> %b, <vscale x 32 x i16> %c, i32 zeroext %evl) { 280; CHECK-LABEL: select_nxv32i16: 281; CHECK: # %bb.0: 282; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma 283; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 284; CHECK-NEXT: ret 285 %v = call <vscale x 32 x i16> @llvm.vp.select.nxv32i16(<vscale x 32 x i1> %a, <vscale x 32 x i16> %b, <vscale x 32 x i16> %c, i32 %evl) 286 ret <vscale x 32 x i16> %v 287} 288 289declare <vscale x 1 x i32> @llvm.vp.select.nxv1i32(<vscale x 1 x i1>, <vscale x 1 x i32>, <vscale x 1 x i32>, i32) 290 291define <vscale x 1 x i32> @select_nxv1i32(<vscale x 1 x i1> %a, <vscale x 1 x i32> %b, <vscale x 1 x i32> %c, i32 zeroext %evl) { 292; CHECK-LABEL: select_nxv1i32: 293; CHECK: # %bb.0: 294; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 295; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 296; CHECK-NEXT: ret 297 %v = call <vscale x 1 x i32> @llvm.vp.select.nxv1i32(<vscale x 1 x i1> %a, <vscale x 1 x i32> %b, <vscale x 1 x i32> %c, i32 %evl) 298 ret <vscale x 1 x i32> %v 299} 300 301declare <vscale x 2 x i32> @llvm.vp.select.nxv2i32(<vscale x 2 x i1>, <vscale x 2 x i32>, <vscale x 2 x i32>, i32) 302 303define <vscale x 2 x i32> @select_nxv2i32(<vscale x 2 x i1> %a, <vscale x 2 x i32> %b, <vscale x 2 x i32> %c, i32 zeroext %evl) { 304; CHECK-LABEL: select_nxv2i32: 305; CHECK: # %bb.0: 306; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 307; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 308; CHECK-NEXT: ret 309 %v = call <vscale x 2 x i32> @llvm.vp.select.nxv2i32(<vscale x 2 x i1> %a, <vscale x 2 x i32> %b, <vscale x 2 x i32> %c, i32 %evl) 310 ret <vscale x 2 x i32> %v 311} 312 313declare <vscale x 4 x i32> @llvm.vp.select.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>, i32) 314 315define <vscale x 4 x i32> @select_nxv4i32(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c, i32 zeroext %evl) { 316; CHECK-LABEL: select_nxv4i32: 317; CHECK: # %bb.0: 318; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 319; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 320; CHECK-NEXT: ret 321 %v = call <vscale x 4 x i32> @llvm.vp.select.nxv4i32(<vscale x 4 x i1> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c, i32 %evl) 322 ret <vscale x 4 x i32> %v 323} 324 325declare <vscale x 8 x i32> @llvm.vp.select.nxv8i32(<vscale x 8 x i1>, <vscale x 8 x i32>, <vscale x 8 x i32>, i32) 326 327define <vscale x 8 x i32> @select_nxv8i32(<vscale x 8 x i1> %a, <vscale x 8 x i32> %b, <vscale x 8 x i32> %c, i32 zeroext %evl) { 328; CHECK-LABEL: select_nxv8i32: 329; CHECK: # %bb.0: 330; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 331; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 332; CHECK-NEXT: ret 333 %v = call <vscale x 8 x i32> @llvm.vp.select.nxv8i32(<vscale x 8 x i1> %a, <vscale x 8 x i32> %b, <vscale x 8 x i32> %c, i32 %evl) 334 ret <vscale x 8 x i32> %v 335} 336 337declare <vscale x 16 x i32> @llvm.vp.select.nxv16i32(<vscale x 16 x i1>, <vscale x 16 x i32>, <vscale x 16 x i32>, i32) 338 339define <vscale x 16 x i32> @select_nxv16i32(<vscale x 16 x i1> %a, <vscale x 16 x i32> %b, <vscale x 16 x i32> %c, i32 zeroext %evl) { 340; CHECK-LABEL: select_nxv16i32: 341; CHECK: # %bb.0: 342; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 343; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 344; CHECK-NEXT: ret 345 %v = call <vscale x 16 x i32> @llvm.vp.select.nxv16i32(<vscale x 16 x i1> %a, <vscale x 16 x i32> %b, <vscale x 16 x i32> %c, i32 %evl) 346 ret <vscale x 16 x i32> %v 347} 348 349declare <vscale x 32 x i32> @llvm.vp.select.nxv32i32(<vscale x 32 x i1>, <vscale x 32 x i32>, <vscale x 32 x i32>, i32) 350 351define <vscale x 32 x i32> @select_nxv32i32(<vscale x 32 x i1> %a, <vscale x 32 x i32> %b, <vscale x 32 x i32> %c, i32 zeroext %evl) { 352; CHECK-LABEL: select_nxv32i32: 353; CHECK: # %bb.0: 354; CHECK-NEXT: addi sp, sp, -16 355; CHECK-NEXT: .cfi_def_cfa_offset 16 356; CHECK-NEXT: csrr a1, vlenb 357; CHECK-NEXT: slli a1, a1, 4 358; CHECK-NEXT: sub sp, sp, a1 359; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb 360; CHECK-NEXT: csrr a1, vlenb 361; CHECK-NEXT: slli a1, a1, 3 362; CHECK-NEXT: add a1, sp, a1 363; CHECK-NEXT: addi a1, a1, 16 364; CHECK-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill 365; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 366; CHECK-NEXT: vmv1r.v v24, v0 367; CHECK-NEXT: csrr a3, vlenb 368; CHECK-NEXT: slli a4, a3, 3 369; CHECK-NEXT: slli a1, a3, 1 370; CHECK-NEXT: srli a3, a3, 2 371; CHECK-NEXT: add a4, a0, a4 372; CHECK-NEXT: sub a5, a2, a1 373; CHECK-NEXT: vl8re32.v v8, (a4) 374; CHECK-NEXT: sltu a4, a2, a5 375; CHECK-NEXT: addi a4, a4, -1 376; CHECK-NEXT: vl8re32.v v0, (a0) 377; CHECK-NEXT: addi a0, sp, 16 378; CHECK-NEXT: vs8r.v v0, (a0) # Unknown-size Folded Spill 379; CHECK-NEXT: vslidedown.vx v0, v24, a3 380; CHECK-NEXT: and a4, a4, a5 381; CHECK-NEXT: vsetvli zero, a4, e32, m8, ta, ma 382; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 383; CHECK-NEXT: bltu a2, a1, .LBB27_2 384; CHECK-NEXT: # %bb.1: 385; CHECK-NEXT: mv a2, a1 386; CHECK-NEXT: .LBB27_2: 387; CHECK-NEXT: vmv1r.v v0, v24 388; CHECK-NEXT: csrr a0, vlenb 389; CHECK-NEXT: slli a0, a0, 3 390; CHECK-NEXT: add a0, sp, a0 391; CHECK-NEXT: addi a0, a0, 16 392; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 393; CHECK-NEXT: addi a0, sp, 16 394; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 395; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma 396; CHECK-NEXT: vmerge.vvm v8, v24, v8, v0 397; CHECK-NEXT: csrr a0, vlenb 398; CHECK-NEXT: slli a0, a0, 4 399; CHECK-NEXT: add sp, sp, a0 400; CHECK-NEXT: .cfi_def_cfa sp, 16 401; CHECK-NEXT: addi sp, sp, 16 402; CHECK-NEXT: .cfi_def_cfa_offset 0 403; CHECK-NEXT: ret 404 %v = call <vscale x 32 x i32> @llvm.vp.select.nxv32i32(<vscale x 32 x i1> %a, <vscale x 32 x i32> %b, <vscale x 32 x i32> %c, i32 %evl) 405 ret <vscale x 32 x i32> %v 406} 407 408declare i32 @llvm.vscale.i32() 409 410define <vscale x 32 x i32> @select_evl_nxv32i32(<vscale x 32 x i1> %a, <vscale x 32 x i32> %b, <vscale x 32 x i32> %c) { 411; CHECK-LABEL: select_evl_nxv32i32: 412; CHECK: # %bb.0: 413; CHECK-NEXT: addi sp, sp, -16 414; CHECK-NEXT: .cfi_def_cfa_offset 16 415; CHECK-NEXT: csrr a1, vlenb 416; CHECK-NEXT: slli a1, a1, 4 417; CHECK-NEXT: sub sp, sp, a1 418; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb 419; CHECK-NEXT: csrr a1, vlenb 420; CHECK-NEXT: slli a1, a1, 3 421; CHECK-NEXT: add a1, sp, a1 422; CHECK-NEXT: addi a1, a1, 16 423; CHECK-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill 424; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 425; CHECK-NEXT: vmv1r.v v24, v0 426; CHECK-NEXT: csrr a1, vlenb 427; CHECK-NEXT: slli a3, a1, 3 428; CHECK-NEXT: slli a2, a1, 1 429; CHECK-NEXT: srli a4, a1, 2 430; CHECK-NEXT: add a3, a0, a3 431; CHECK-NEXT: sub a5, a1, a2 432; CHECK-NEXT: vl8re32.v v8, (a3) 433; CHECK-NEXT: sltu a3, a1, a5 434; CHECK-NEXT: addi a3, a3, -1 435; CHECK-NEXT: vl8re32.v v0, (a0) 436; CHECK-NEXT: addi a0, sp, 16 437; CHECK-NEXT: vs8r.v v0, (a0) # Unknown-size Folded Spill 438; CHECK-NEXT: vslidedown.vx v0, v24, a4 439; CHECK-NEXT: and a3, a3, a5 440; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma 441; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 442; CHECK-NEXT: bltu a1, a2, .LBB28_2 443; CHECK-NEXT: # %bb.1: 444; CHECK-NEXT: mv a1, a2 445; CHECK-NEXT: .LBB28_2: 446; CHECK-NEXT: vmv1r.v v0, v24 447; CHECK-NEXT: csrr a0, vlenb 448; CHECK-NEXT: slli a0, a0, 3 449; CHECK-NEXT: add a0, sp, a0 450; CHECK-NEXT: addi a0, a0, 16 451; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 452; CHECK-NEXT: addi a0, sp, 16 453; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 454; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 455; CHECK-NEXT: vmerge.vvm v8, v24, v8, v0 456; CHECK-NEXT: csrr a0, vlenb 457; CHECK-NEXT: slli a0, a0, 4 458; CHECK-NEXT: add sp, sp, a0 459; CHECK-NEXT: .cfi_def_cfa sp, 16 460; CHECK-NEXT: addi sp, sp, 16 461; CHECK-NEXT: .cfi_def_cfa_offset 0 462; CHECK-NEXT: ret 463 %evl = call i32 @llvm.vscale.i32() 464 %evl0 = mul i32 %evl, 8 465 %v = call <vscale x 32 x i32> @llvm.vp.select.nxv32i32(<vscale x 32 x i1> %a, <vscale x 32 x i32> %b, <vscale x 32 x i32> %c, i32 %evl0) 466 ret <vscale x 32 x i32> %v 467} 468 469declare <vscale x 1 x i64> @llvm.vp.select.nxv1i64(<vscale x 1 x i1>, <vscale x 1 x i64>, <vscale x 1 x i64>, i32) 470 471define <vscale x 1 x i64> @select_nxv1i64(<vscale x 1 x i1> %a, <vscale x 1 x i64> %b, <vscale x 1 x i64> %c, i32 zeroext %evl) { 472; CHECK-LABEL: select_nxv1i64: 473; CHECK: # %bb.0: 474; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 475; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 476; CHECK-NEXT: ret 477 %v = call <vscale x 1 x i64> @llvm.vp.select.nxv1i64(<vscale x 1 x i1> %a, <vscale x 1 x i64> %b, <vscale x 1 x i64> %c, i32 %evl) 478 ret <vscale x 1 x i64> %v 479} 480 481declare <vscale x 2 x i64> @llvm.vp.select.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>, i32) 482 483define <vscale x 2 x i64> @select_nxv2i64(<vscale x 2 x i1> %a, <vscale x 2 x i64> %b, <vscale x 2 x i64> %c, i32 zeroext %evl) { 484; CHECK-LABEL: select_nxv2i64: 485; CHECK: # %bb.0: 486; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 487; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 488; CHECK-NEXT: ret 489 %v = call <vscale x 2 x i64> @llvm.vp.select.nxv2i64(<vscale x 2 x i1> %a, <vscale x 2 x i64> %b, <vscale x 2 x i64> %c, i32 %evl) 490 ret <vscale x 2 x i64> %v 491} 492 493declare <vscale x 4 x i64> @llvm.vp.select.nxv4i64(<vscale x 4 x i1>, <vscale x 4 x i64>, <vscale x 4 x i64>, i32) 494 495define <vscale x 4 x i64> @select_nxv4i64(<vscale x 4 x i1> %a, <vscale x 4 x i64> %b, <vscale x 4 x i64> %c, i32 zeroext %evl) { 496; CHECK-LABEL: select_nxv4i64: 497; CHECK: # %bb.0: 498; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 499; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 500; CHECK-NEXT: ret 501 %v = call <vscale x 4 x i64> @llvm.vp.select.nxv4i64(<vscale x 4 x i1> %a, <vscale x 4 x i64> %b, <vscale x 4 x i64> %c, i32 %evl) 502 ret <vscale x 4 x i64> %v 503} 504 505declare <vscale x 8 x i64> @llvm.vp.select.nxv8i64(<vscale x 8 x i1>, <vscale x 8 x i64>, <vscale x 8 x i64>, i32) 506 507define <vscale x 8 x i64> @select_nxv8i64(<vscale x 8 x i1> %a, <vscale x 8 x i64> %b, <vscale x 8 x i64> %c, i32 zeroext %evl) { 508; CHECK-LABEL: select_nxv8i64: 509; CHECK: # %bb.0: 510; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 511; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 512; CHECK-NEXT: ret 513 %v = call <vscale x 8 x i64> @llvm.vp.select.nxv8i64(<vscale x 8 x i1> %a, <vscale x 8 x i64> %b, <vscale x 8 x i64> %c, i32 %evl) 514 ret <vscale x 8 x i64> %v 515} 516 517declare <vscale x 1 x half> @llvm.vp.select.nxv1f16(<vscale x 1 x i1>, <vscale x 1 x half>, <vscale x 1 x half>, i32) 518 519define <vscale x 1 x half> @select_nxv1f16(<vscale x 1 x i1> %a, <vscale x 1 x half> %b, <vscale x 1 x half> %c, i32 zeroext %evl) { 520; CHECK-LABEL: select_nxv1f16: 521; CHECK: # %bb.0: 522; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 523; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 524; CHECK-NEXT: ret 525 %v = call <vscale x 1 x half> @llvm.vp.select.nxv1f16(<vscale x 1 x i1> %a, <vscale x 1 x half> %b, <vscale x 1 x half> %c, i32 %evl) 526 ret <vscale x 1 x half> %v 527} 528 529declare <vscale x 2 x half> @llvm.vp.select.nxv2f16(<vscale x 2 x i1>, <vscale x 2 x half>, <vscale x 2 x half>, i32) 530 531define <vscale x 2 x half> @select_nxv2f16(<vscale x 2 x i1> %a, <vscale x 2 x half> %b, <vscale x 2 x half> %c, i32 zeroext %evl) { 532; CHECK-LABEL: select_nxv2f16: 533; CHECK: # %bb.0: 534; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 535; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 536; CHECK-NEXT: ret 537 %v = call <vscale x 2 x half> @llvm.vp.select.nxv2f16(<vscale x 2 x i1> %a, <vscale x 2 x half> %b, <vscale x 2 x half> %c, i32 %evl) 538 ret <vscale x 2 x half> %v 539} 540 541declare <vscale x 4 x half> @llvm.vp.select.nxv4f16(<vscale x 4 x i1>, <vscale x 4 x half>, <vscale x 4 x half>, i32) 542 543define <vscale x 4 x half> @select_nxv4f16(<vscale x 4 x i1> %a, <vscale x 4 x half> %b, <vscale x 4 x half> %c, i32 zeroext %evl) { 544; CHECK-LABEL: select_nxv4f16: 545; CHECK: # %bb.0: 546; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 547; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 548; CHECK-NEXT: ret 549 %v = call <vscale x 4 x half> @llvm.vp.select.nxv4f16(<vscale x 4 x i1> %a, <vscale x 4 x half> %b, <vscale x 4 x half> %c, i32 %evl) 550 ret <vscale x 4 x half> %v 551} 552 553declare <vscale x 8 x half> @llvm.vp.select.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>, <vscale x 8 x half>, i32) 554 555define <vscale x 8 x half> @select_nxv8f16(<vscale x 8 x i1> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, i32 zeroext %evl) { 556; CHECK-LABEL: select_nxv8f16: 557; CHECK: # %bb.0: 558; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 559; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 560; CHECK-NEXT: ret 561 %v = call <vscale x 8 x half> @llvm.vp.select.nxv8f16(<vscale x 8 x i1> %a, <vscale x 8 x half> %b, <vscale x 8 x half> %c, i32 %evl) 562 ret <vscale x 8 x half> %v 563} 564 565declare <vscale x 16 x half> @llvm.vp.select.nxv16f16(<vscale x 16 x i1>, <vscale x 16 x half>, <vscale x 16 x half>, i32) 566 567define <vscale x 16 x half> @select_nxv16f16(<vscale x 16 x i1> %a, <vscale x 16 x half> %b, <vscale x 16 x half> %c, i32 zeroext %evl) { 568; CHECK-LABEL: select_nxv16f16: 569; CHECK: # %bb.0: 570; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 571; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 572; CHECK-NEXT: ret 573 %v = call <vscale x 16 x half> @llvm.vp.select.nxv16f16(<vscale x 16 x i1> %a, <vscale x 16 x half> %b, <vscale x 16 x half> %c, i32 %evl) 574 ret <vscale x 16 x half> %v 575} 576 577declare <vscale x 32 x half> @llvm.vp.select.nxv32f16(<vscale x 32 x i1>, <vscale x 32 x half>, <vscale x 32 x half>, i32) 578 579define <vscale x 32 x half> @select_nxv32f16(<vscale x 32 x i1> %a, <vscale x 32 x half> %b, <vscale x 32 x half> %c, i32 zeroext %evl) { 580; CHECK-LABEL: select_nxv32f16: 581; CHECK: # %bb.0: 582; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma 583; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 584; CHECK-NEXT: ret 585 %v = call <vscale x 32 x half> @llvm.vp.select.nxv32f16(<vscale x 32 x i1> %a, <vscale x 32 x half> %b, <vscale x 32 x half> %c, i32 %evl) 586 ret <vscale x 32 x half> %v 587} 588 589declare <vscale x 1 x float> @llvm.vp.select.nxv1f32(<vscale x 1 x i1>, <vscale x 1 x float>, <vscale x 1 x float>, i32) 590 591define <vscale x 1 x float> @select_nxv1f32(<vscale x 1 x i1> %a, <vscale x 1 x float> %b, <vscale x 1 x float> %c, i32 zeroext %evl) { 592; CHECK-LABEL: select_nxv1f32: 593; CHECK: # %bb.0: 594; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 595; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 596; CHECK-NEXT: ret 597 %v = call <vscale x 1 x float> @llvm.vp.select.nxv1f32(<vscale x 1 x i1> %a, <vscale x 1 x float> %b, <vscale x 1 x float> %c, i32 %evl) 598 ret <vscale x 1 x float> %v 599} 600 601declare <vscale x 2 x float> @llvm.vp.select.nxv2f32(<vscale x 2 x i1>, <vscale x 2 x float>, <vscale x 2 x float>, i32) 602 603define <vscale x 2 x float> @select_nxv2f32(<vscale x 2 x i1> %a, <vscale x 2 x float> %b, <vscale x 2 x float> %c, i32 zeroext %evl) { 604; CHECK-LABEL: select_nxv2f32: 605; CHECK: # %bb.0: 606; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 607; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 608; CHECK-NEXT: ret 609 %v = call <vscale x 2 x float> @llvm.vp.select.nxv2f32(<vscale x 2 x i1> %a, <vscale x 2 x float> %b, <vscale x 2 x float> %c, i32 %evl) 610 ret <vscale x 2 x float> %v 611} 612 613declare <vscale x 4 x float> @llvm.vp.select.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>, <vscale x 4 x float>, i32) 614 615define <vscale x 4 x float> @select_nxv4f32(<vscale x 4 x i1> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, i32 zeroext %evl) { 616; CHECK-LABEL: select_nxv4f32: 617; CHECK: # %bb.0: 618; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 619; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 620; CHECK-NEXT: ret 621 %v = call <vscale x 4 x float> @llvm.vp.select.nxv4f32(<vscale x 4 x i1> %a, <vscale x 4 x float> %b, <vscale x 4 x float> %c, i32 %evl) 622 ret <vscale x 4 x float> %v 623} 624 625declare <vscale x 8 x float> @llvm.vp.select.nxv8f32(<vscale x 8 x i1>, <vscale x 8 x float>, <vscale x 8 x float>, i32) 626 627define <vscale x 8 x float> @select_nxv8f32(<vscale x 8 x i1> %a, <vscale x 8 x float> %b, <vscale x 8 x float> %c, i32 zeroext %evl) { 628; CHECK-LABEL: select_nxv8f32: 629; CHECK: # %bb.0: 630; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 631; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 632; CHECK-NEXT: ret 633 %v = call <vscale x 8 x float> @llvm.vp.select.nxv8f32(<vscale x 8 x i1> %a, <vscale x 8 x float> %b, <vscale x 8 x float> %c, i32 %evl) 634 ret <vscale x 8 x float> %v 635} 636 637declare <vscale x 16 x float> @llvm.vp.select.nxv16f32(<vscale x 16 x i1>, <vscale x 16 x float>, <vscale x 16 x float>, i32) 638 639define <vscale x 16 x float> @select_nxv16f32(<vscale x 16 x i1> %a, <vscale x 16 x float> %b, <vscale x 16 x float> %c, i32 zeroext %evl) { 640; CHECK-LABEL: select_nxv16f32: 641; CHECK: # %bb.0: 642; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 643; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 644; CHECK-NEXT: ret 645 %v = call <vscale x 16 x float> @llvm.vp.select.nxv16f32(<vscale x 16 x i1> %a, <vscale x 16 x float> %b, <vscale x 16 x float> %c, i32 %evl) 646 ret <vscale x 16 x float> %v 647} 648 649declare <vscale x 1 x double> @llvm.vp.select.nxv1f64(<vscale x 1 x i1>, <vscale x 1 x double>, <vscale x 1 x double>, i32) 650 651define <vscale x 1 x double> @select_nxv1f64(<vscale x 1 x i1> %a, <vscale x 1 x double> %b, <vscale x 1 x double> %c, i32 zeroext %evl) { 652; CHECK-LABEL: select_nxv1f64: 653; CHECK: # %bb.0: 654; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 655; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 656; CHECK-NEXT: ret 657 %v = call <vscale x 1 x double> @llvm.vp.select.nxv1f64(<vscale x 1 x i1> %a, <vscale x 1 x double> %b, <vscale x 1 x double> %c, i32 %evl) 658 ret <vscale x 1 x double> %v 659} 660 661declare <vscale x 2 x double> @llvm.vp.select.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>, <vscale x 2 x double>, i32) 662 663define <vscale x 2 x double> @select_nxv2f64(<vscale x 2 x i1> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, i32 zeroext %evl) { 664; CHECK-LABEL: select_nxv2f64: 665; CHECK: # %bb.0: 666; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 667; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 668; CHECK-NEXT: ret 669 %v = call <vscale x 2 x double> @llvm.vp.select.nxv2f64(<vscale x 2 x i1> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c, i32 %evl) 670 ret <vscale x 2 x double> %v 671} 672 673declare <vscale x 4 x double> @llvm.vp.select.nxv4f64(<vscale x 4 x i1>, <vscale x 4 x double>, <vscale x 4 x double>, i32) 674 675define <vscale x 4 x double> @select_nxv4f64(<vscale x 4 x i1> %a, <vscale x 4 x double> %b, <vscale x 4 x double> %c, i32 zeroext %evl) { 676; CHECK-LABEL: select_nxv4f64: 677; CHECK: # %bb.0: 678; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 679; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 680; CHECK-NEXT: ret 681 %v = call <vscale x 4 x double> @llvm.vp.select.nxv4f64(<vscale x 4 x i1> %a, <vscale x 4 x double> %b, <vscale x 4 x double> %c, i32 %evl) 682 ret <vscale x 4 x double> %v 683} 684 685declare <vscale x 8 x double> @llvm.vp.select.nxv8f64(<vscale x 8 x i1>, <vscale x 8 x double>, <vscale x 8 x double>, i32) 686 687define <vscale x 8 x double> @select_nxv8f64(<vscale x 8 x i1> %a, <vscale x 8 x double> %b, <vscale x 8 x double> %c, i32 zeroext %evl) { 688; CHECK-LABEL: select_nxv8f64: 689; CHECK: # %bb.0: 690; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 691; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 692; CHECK-NEXT: ret 693 %v = call <vscale x 8 x double> @llvm.vp.select.nxv8f64(<vscale x 8 x i1> %a, <vscale x 8 x double> %b, <vscale x 8 x double> %c, i32 %evl) 694 ret <vscale x 8 x double> %v 695} 696 697declare <vscale x 16 x double> @llvm.vp.select.nxv16f64(<vscale x 16 x i1>, <vscale x 16 x double>, <vscale x 16 x double>, i32) 698 699define <vscale x 16 x double> @select_nxv16f64(<vscale x 16 x i1> %a, <vscale x 16 x double> %b, <vscale x 16 x double> %c, i32 zeroext %evl) { 700; CHECK-LABEL: select_nxv16f64: 701; CHECK: # %bb.0: 702; CHECK-NEXT: addi sp, sp, -16 703; CHECK-NEXT: .cfi_def_cfa_offset 16 704; CHECK-NEXT: csrr a1, vlenb 705; CHECK-NEXT: slli a1, a1, 4 706; CHECK-NEXT: sub sp, sp, a1 707; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb 708; CHECK-NEXT: csrr a1, vlenb 709; CHECK-NEXT: slli a1, a1, 3 710; CHECK-NEXT: add a1, sp, a1 711; CHECK-NEXT: addi a1, a1, 16 712; CHECK-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill 713; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 714; CHECK-NEXT: vmv1r.v v24, v0 715; CHECK-NEXT: csrr a1, vlenb 716; CHECK-NEXT: slli a3, a1, 3 717; CHECK-NEXT: sub a4, a2, a1 718; CHECK-NEXT: add a3, a0, a3 719; CHECK-NEXT: sltu a5, a2, a4 720; CHECK-NEXT: vl8re64.v v8, (a3) 721; CHECK-NEXT: addi a5, a5, -1 722; CHECK-NEXT: srli a3, a1, 3 723; CHECK-NEXT: vl8re64.v v0, (a0) 724; CHECK-NEXT: addi a0, sp, 16 725; CHECK-NEXT: vs8r.v v0, (a0) # Unknown-size Folded Spill 726; CHECK-NEXT: vslidedown.vx v0, v24, a3 727; CHECK-NEXT: and a4, a5, a4 728; CHECK-NEXT: vsetvli zero, a4, e64, m8, ta, ma 729; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 730; CHECK-NEXT: bltu a2, a1, .LBB48_2 731; CHECK-NEXT: # %bb.1: 732; CHECK-NEXT: mv a2, a1 733; CHECK-NEXT: .LBB48_2: 734; CHECK-NEXT: vmv1r.v v0, v24 735; CHECK-NEXT: csrr a0, vlenb 736; CHECK-NEXT: slli a0, a0, 3 737; CHECK-NEXT: add a0, sp, a0 738; CHECK-NEXT: addi a0, a0, 16 739; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 740; CHECK-NEXT: addi a0, sp, 16 741; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload 742; CHECK-NEXT: vsetvli zero, a2, e64, m8, ta, ma 743; CHECK-NEXT: vmerge.vvm v8, v24, v8, v0 744; CHECK-NEXT: csrr a0, vlenb 745; CHECK-NEXT: slli a0, a0, 4 746; CHECK-NEXT: add sp, sp, a0 747; CHECK-NEXT: .cfi_def_cfa sp, 16 748; CHECK-NEXT: addi sp, sp, 16 749; CHECK-NEXT: .cfi_def_cfa_offset 0 750; CHECK-NEXT: ret 751 %v = call <vscale x 16 x double> @llvm.vp.select.nxv16f64(<vscale x 16 x i1> %a, <vscale x 16 x double> %b, <vscale x 16 x double> %c, i32 %evl) 752 ret <vscale x 16 x double> %v 753} 754 755define <vscale x 2 x i1> @select_zero(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %m, i32 zeroext %evl) { 756; CHECK-LABEL: select_zero: 757; CHECK: # %bb.0: 758; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 759; CHECK-NEXT: vmand.mm v0, v0, v8 760; CHECK-NEXT: ret 761 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> zeroinitializer, i32 %evl) 762 ret <vscale x 2 x i1> %a 763} 764 765define <vscale x 2 x i1> @select_one(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %m, i32 zeroext %evl) { 766; CHECK-LABEL: select_one: 767; CHECK: # %bb.0: 768; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 769; CHECK-NEXT: vmorn.mm v0, v8, v0 770; CHECK-NEXT: ret 771 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> splat (i1 true), i32 %evl) 772 ret <vscale x 2 x i1> %a 773} 774 775define <vscale x 2 x i1> @select_x_zero(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) { 776; CHECK-LABEL: select_x_zero: 777; CHECK: # %bb.0: 778; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 779; CHECK-NEXT: vmand.mm v0, v0, v8 780; CHECK-NEXT: ret 781 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> zeroinitializer, i32 %evl) 782 ret <vscale x 2 x i1> %a 783} 784 785define <vscale x 2 x i1> @select_x_one(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) { 786; CHECK-LABEL: select_x_one: 787; CHECK: # %bb.0: 788; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 789; CHECK-NEXT: vmorn.mm v0, v8, v0 790; CHECK-NEXT: ret 791 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> splat (i1 true), i32 %evl) 792 ret <vscale x 2 x i1> %a 793} 794 795define <vscale x 2 x i1> @select_zero_x(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) { 796; CHECK-LABEL: select_zero_x: 797; CHECK: # %bb.0: 798; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 799; CHECK-NEXT: vmandn.mm v0, v8, v0 800; CHECK-NEXT: ret 801 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> zeroinitializer, <vscale x 2 x i1> %y, i32 %evl) 802 ret <vscale x 2 x i1> %a 803} 804 805define <vscale x 2 x i1> @select_one_x(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) { 806; CHECK-LABEL: select_one_x: 807; CHECK: # %bb.0: 808; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 809; CHECK-NEXT: vmor.mm v0, v0, v8 810; CHECK-NEXT: ret 811 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> splat (i1 true), <vscale x 2 x i1> %y, i32 %evl) 812 ret <vscale x 2 x i1> %a 813} 814 815define <vscale x 2 x i1> @select_cond_cond_x(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %m, i32 zeroext %evl) { 816; CHECK-LABEL: select_cond_cond_x: 817; CHECK: # %bb.0: 818; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 819; CHECK-NEXT: vmor.mm v0, v0, v8 820; CHECK-NEXT: ret 821 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 %evl) 822 ret <vscale x 2 x i1> %a 823} 824 825define <vscale x 2 x i1> @select_cond_x_cond(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %m, i32 zeroext %evl) { 826; CHECK-LABEL: select_cond_x_cond: 827; CHECK: # %bb.0: 828; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 829; CHECK-NEXT: vmand.mm v0, v0, v8 830; CHECK-NEXT: ret 831 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %x, i32 %evl) 832 ret <vscale x 2 x i1> %a 833} 834 835define <vscale x 2 x i1> @select_undef_T_F(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) { 836; CHECK-LABEL: select_undef_T_F: 837; CHECK: # %bb.0: 838; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 839; CHECK-NEXT: vmv1r.v v0, v8 840; CHECK-NEXT: ret 841 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> poison, <vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 %evl) 842 ret <vscale x 2 x i1> %a 843} 844 845define <vscale x 2 x i1> @select_undef_undef_F(<vscale x 2 x i1> %x, i32 zeroext %evl) { 846; CHECK-LABEL: select_undef_undef_F: 847; CHECK: # %bb.0: 848; CHECK-NEXT: ret 849 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> poison, <vscale x 2 x i1> undef, <vscale x 2 x i1> %x, i32 %evl) 850 ret <vscale x 2 x i1> %a 851} 852 853define <vscale x 2 x i1> @select_unknown_undef_F(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) { 854; CHECK-LABEL: select_unknown_undef_F: 855; CHECK: # %bb.0: 856; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 857; CHECK-NEXT: vmv1r.v v0, v8 858; CHECK-NEXT: ret 859 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> undef, <vscale x 2 x i1> %y, i32 %evl) 860 ret <vscale x 2 x i1> %a 861} 862 863define <vscale x 2 x i1> @select_unknown_T_undef(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) { 864; CHECK-LABEL: select_unknown_T_undef: 865; CHECK: # %bb.0: 866; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 867; CHECK-NEXT: vmv1r.v v0, v8 868; CHECK-NEXT: ret 869 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> poison, i32 %evl) 870 ret <vscale x 2 x i1> %a 871} 872 873define <vscale x 2 x i1> @select_false_T_F(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %z, i32 zeroext %evl) { 874; CHECK-LABEL: select_false_T_F: 875; CHECK: # %bb.0: 876; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 877; CHECK-NEXT: vmv1r.v v0, v9 878; CHECK-NEXT: ret 879 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> zeroinitializer, <vscale x 2 x i1> %y, <vscale x 2 x i1> %z, i32 %evl) 880 ret <vscale x 2 x i1> %a 881} 882 883define <vscale x 2 x i1> @select_unknown_T_T(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) { 884; CHECK-LABEL: select_unknown_T_T: 885; CHECK: # %bb.0: 886; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 887; CHECK-NEXT: vmv1r.v v0, v8 888; CHECK-NEXT: ret 889 %a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %y, i32 %evl) 890 ret <vscale x 2 x i1> %a 891} 892