; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=riscv32 -mattr=+d,+m,+zvfh,+v -target-abi=ilp32d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 ; RUN: llc -mtriple=riscv64 -mattr=+d,+m,+zvfh,+v -target-abi=lp64d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 ; RUN: llc -mtriple=riscv32 -mattr=+d,+m,+zvfhmin,+v -target-abi=ilp32d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 ; RUN: llc -mtriple=riscv64 -mattr=+d,+m,+zvfhmin,+v -target-abi=lp64d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 define @select_nxv1i1( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv1i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma ; CHECK-NEXT: vmandn.mm v9, v9, v0 ; CHECK-NEXT: vmand.mm v8, v8, v0 ; CHECK-NEXT: vmor.mm v0, v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv1i1( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2i1( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmandn.mm v9, v9, v0 ; CHECK-NEXT: vmand.mm v8, v8, v0 ; CHECK-NEXT: vmor.mm v0, v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2i1( %a, %b, %c, i32 %evl) ret %v } define @select_nxv4i1( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv4i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma ; CHECK-NEXT: vmandn.mm v9, v9, v0 ; CHECK-NEXT: vmand.mm v8, v8, v0 ; CHECK-NEXT: vmor.mm v0, v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv4i1( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8i1( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma ; CHECK-NEXT: vmandn.mm v9, v9, v0 ; CHECK-NEXT: vmand.mm v8, v8, v0 ; CHECK-NEXT: vmor.mm v0, v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8i1( %a, %b, %c, i32 %evl) ret %v } define @select_nxv16i1( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv16i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma ; CHECK-NEXT: vmandn.mm v9, v9, v0 ; CHECK-NEXT: vmand.mm v8, v8, v0 ; CHECK-NEXT: vmor.mm v0, v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv16i1( %a, %b, %c, i32 %evl) ret %v } define @select_nxv32i1( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv32i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma ; CHECK-NEXT: vmandn.mm v9, v9, v0 ; CHECK-NEXT: vmand.mm v8, v8, v0 ; CHECK-NEXT: vmor.mm v0, v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv32i1( %a, %b, %c, i32 %evl) ret %v } define @select_nxv64i1( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv64i1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma ; CHECK-NEXT: vmandn.mm v9, v9, v0 ; CHECK-NEXT: vmand.mm v8, v8, v0 ; CHECK-NEXT: vmor.mm v0, v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv64i1( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8i7( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8i7: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8i7( %a, %b, %c, i32 %evl) ret %v } define @select_nxv1i8( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv1i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv1i8( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2i8( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2i8( %a, %b, %c, i32 %evl) ret %v } define @select_nxv4i8( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv4i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv4i8( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8i8( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8i8( %a, %b, %c, i32 %evl) ret %v } define @select_nxv14i8( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv14i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv14i8( %a, %b, %c, i32 %evl) ret %v } define @select_nxv16i8( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv16i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv16i8( %a, %b, %c, i32 %evl) ret %v } define @select_nxv32i8( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv32i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv32i8( %a, %b, %c, i32 %evl) ret %v } define @select_nxv64i8( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv64i8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv64i8( %a, %b, %c, i32 %evl) ret %v } define @select_nxv1i16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv1i16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv1i16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2i16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2i16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2i16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv4i16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv4i16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv4i16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8i16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8i16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8i16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv16i16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv16i16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv16i16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv32i16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv32i16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv32i16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv1i32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv1i32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2i32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2i32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv4i32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv4i32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8i32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8i32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv16i32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv16i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv16i32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv32i32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv32i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vl8re32.v v24, (a0) ; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v24, v8, v0 ; CHECK-NEXT: csrr a1, vlenb ; CHECK-NEXT: slli a2, a1, 3 ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl8re32.v v24, (a0) ; CHECK-NEXT: srli a1, a1, 2 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma ; CHECK-NEXT: vslidedown.vx v0, v0, a1 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v16, v24, v16, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv32i32( %a, %b, %c, i32 %evl) ret %v } define @select_evl_nxv32i32( %a, %b, %c) { ; CHECK-LABEL: select_evl_nxv32i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vl8re32.v v24, (a0) ; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v24, v8, v0 ; CHECK-NEXT: csrr a1, vlenb ; CHECK-NEXT: slli a2, a1, 3 ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl8re32.v v24, (a0) ; CHECK-NEXT: srli a1, a1, 2 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma ; CHECK-NEXT: vslidedown.vx v0, v0, a1 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v16, v24, v16, v0 ; CHECK-NEXT: ret %evl = call i32 @llvm.vscale.i32() %evl0 = mul i32 %evl, 8 %v = call @llvm.vp.select.nxv32i32( %a, %b, %c, i32 %evl0) ret %v } define @select_nxv1i64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv1i64: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv1i64( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2i64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2i64: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2i64( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2i64_constant_true( %a, %b, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2i64_constant_true: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma ; CHECK-NEXT: vmerge.vim v8, v8, -1, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2i64( %a, splat (i64 -1), %b, i32 %evl) ret %v } define @select_nxv2i64_constant_false( %a, %b, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2i64_constant_false: ; CHECK: # %bb.0: ; CHECK-NEXT: li a0, 100 ; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma ; CHECK-NEXT: vmv.v.x v10, a0 ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2i64( %a, %b, splat (i64 100), i32 %evl) ret %v } define @select_nxv4i64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv4i64: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv4i64( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8i64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8i64: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8i64( %a, %b, %c, i32 %evl) ret %v } define @select_nxv1f16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv1f16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv1f16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2f16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2f16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2f16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv4f16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv4f16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv4f16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8f16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8f16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8f16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv16f16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv16f16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv16f16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv32f16( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv32f16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv32f16( %a, %b, %c, i32 %evl) ret %v } define @select_nxv1f32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv1f32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv1f32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2f32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2f32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2f32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv4f32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv4f32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv4f32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8f32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8f32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8f32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv16f32( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv16f32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv16f32( %a, %b, %c, i32 %evl) ret %v } define @select_nxv1f64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv1f64: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv1f64( %a, %b, %c, i32 %evl) ret %v } define @select_nxv2f64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv2f64: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv2f64( %a, %b, %c, i32 %evl) ret %v } define @select_nxv4f64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv4f64: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv4f64( %a, %b, %c, i32 %evl) ret %v } define @select_nxv8f64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv8f64: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv8f64( %a, %b, %c, i32 %evl) ret %v } define @select_nxv16f64( %a, %b, %c, i32 zeroext %evl) { ; CHECK-LABEL: select_nxv16f64: ; CHECK: # %bb.0: ; CHECK-NEXT: vl8re64.v v24, (a0) ; CHECK-NEXT: vsetvli a1, zero, e64, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v8, v24, v8, v0 ; CHECK-NEXT: csrr a1, vlenb ; CHECK-NEXT: slli a2, a1, 3 ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl8re64.v v24, (a0) ; CHECK-NEXT: srli a1, a1, 3 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vslidedown.vx v0, v0, a1 ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma ; CHECK-NEXT: vmerge.vvm v16, v24, v16, v0 ; CHECK-NEXT: ret %v = call @llvm.vp.select.nxv16f64( %a, %b, %c, i32 %evl) ret %v } define @select_zero( %x, %y, %m, i32 zeroext %evl) { ; CHECK-LABEL: select_zero: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, %y, zeroinitializer, i32 %evl) ret %a } define @select_one( %x, %y, %m, i32 zeroext %evl) { ; CHECK-LABEL: select_one: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmorn.mm v0, v8, v0 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, %y, splat (i1 true), i32 %evl) ret %a } define @select_x_zero( %x, %y, i32 zeroext %evl) { ; CHECK-LABEL: select_x_zero: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, %y, zeroinitializer, i32 %evl) ret %a } define @select_x_one( %x, %y, i32 zeroext %evl) { ; CHECK-LABEL: select_x_one: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmorn.mm v0, v8, v0 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, %y, splat (i1 true), i32 %evl) ret %a } define @select_zero_x( %x, %y, i32 zeroext %evl) { ; CHECK-LABEL: select_zero_x: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmandn.mm v0, v8, v0 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, zeroinitializer, %y, i32 %evl) ret %a } define @select_one_x( %x, %y, i32 zeroext %evl) { ; CHECK-LABEL: select_one_x: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmor.mm v0, v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, splat (i1 true), %y, i32 %evl) ret %a } define @select_cond_cond_x( %x, %y, %m, i32 zeroext %evl) { ; CHECK-LABEL: select_cond_cond_x: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmor.mm v0, v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, %x, %y, i32 %evl) ret %a } define @select_cond_x_cond( %x, %y, %m, i32 zeroext %evl) { ; CHECK-LABEL: select_cond_x_cond: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, %y, %x, i32 %evl) ret %a } define @select_undef_T_F( %x, %y, i32 zeroext %evl) { ; CHECK-LABEL: select_undef_T_F: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( poison, %x, %y, i32 %evl) ret %a } define @select_undef_undef_F( %x, i32 zeroext %evl) { ; CHECK-LABEL: select_undef_undef_F: ; CHECK: # %bb.0: ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( poison, poison, %x, i32 %evl) ret %a } define @select_unknown_undef_F( %x, %y, i32 zeroext %evl) { ; CHECK-LABEL: select_unknown_undef_F: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, poison, %y, i32 %evl) ret %a } define @select_unknown_T_undef( %x, %y, i32 zeroext %evl) { ; CHECK-LABEL: select_unknown_T_undef: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, %y, poison, i32 %evl) ret %a } define @select_false_T_F( %x, %y, %z, i32 zeroext %evl) { ; CHECK-LABEL: select_false_T_F: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v0, v9 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( zeroinitializer, %y, %z, i32 %evl) ret %a } define @select_unknown_T_T( %x, %y, i32 zeroext %evl) { ; CHECK-LABEL: select_unknown_T_T: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v0, v8 ; CHECK-NEXT: ret %a = call @llvm.vp.select.nxv2i1( %x, %y, %y, i32 %evl) ret %a } ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; RV32: {{.*}} ; RV64: {{.*}}