; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=riscv32 -mattr=+d,+v,+m,+zfbfmin,+zvfbfmin -target-abi=ilp32d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=riscv64 -mattr=+d,+v,+m,+zfbfmin,+zvfbfmin -target-abi=lp64d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=riscv32 -mattr=+d,+v,+zvfh,+m,+zfbfmin,+zvfbfmin -target-abi=ilp32d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=riscv64 -mattr=+d,+v,+zvfh,+m,+zfbfmin,+zvfbfmin -target-abi=lp64d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s define @vpmerge_vv_nxv1bf16( %va, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vv_nxv1bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 ; CHECK-NEXT: vmv1r.v v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.merge.nxv1bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vf_nxv1bf16(bfloat %a, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vf_nxv1bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: fmv.x.h a1, fa0 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma ; CHECK-NEXT: vmv.v.x v9, a1 ; CHECK-NEXT: vsetvli zero, zero, e16, mf4, tu, ma ; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 ; CHECK-NEXT: ret %elt.head = insertelement poison, bfloat %a, i32 0 %va = shufflevector %elt.head, poison, zeroinitializer %v = call @llvm.vp.merge.nxv1bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vv_nxv2bf16( %va, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vv_nxv2bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 ; CHECK-NEXT: vmv1r.v v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.merge.nxv2bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vf_nxv2bf16(bfloat %a, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vf_nxv2bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: fmv.x.h a1, fa0 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma ; CHECK-NEXT: vmv.v.x v9, a1 ; CHECK-NEXT: vsetvli zero, zero, e16, mf2, tu, ma ; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 ; CHECK-NEXT: ret %elt.head = insertelement poison, bfloat %a, i32 0 %va = shufflevector %elt.head, poison, zeroinitializer %v = call @llvm.vp.merge.nxv2bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vv_nxv4bf16( %va, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vv_nxv4bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 ; CHECK-NEXT: vmv1r.v v8, v9 ; CHECK-NEXT: ret %v = call @llvm.vp.merge.nxv4bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vf_nxv4bf16(bfloat %a, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vf_nxv4bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: fmv.x.h a1, fa0 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma ; CHECK-NEXT: vmv.v.x v9, a1 ; CHECK-NEXT: vsetvli zero, zero, e16, m1, tu, ma ; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 ; CHECK-NEXT: ret %elt.head = insertelement poison, bfloat %a, i32 0 %va = shufflevector %elt.head, poison, zeroinitializer %v = call @llvm.vp.merge.nxv4bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vv_nxv8bf16( %va, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vv_nxv8bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma ; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0 ; CHECK-NEXT: vmv2r.v v8, v10 ; CHECK-NEXT: ret %v = call @llvm.vp.merge.nxv8bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vf_nxv8bf16(bfloat %a, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vf_nxv8bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: fmv.x.h a1, fa0 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma ; CHECK-NEXT: vmv.v.x v10, a1 ; CHECK-NEXT: vsetvli zero, zero, e16, m2, tu, ma ; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0 ; CHECK-NEXT: ret %elt.head = insertelement poison, bfloat %a, i32 0 %va = shufflevector %elt.head, poison, zeroinitializer %v = call @llvm.vp.merge.nxv8bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vv_nxv16bf16( %va, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vv_nxv16bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, ma ; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0 ; CHECK-NEXT: vmv4r.v v8, v12 ; CHECK-NEXT: ret %v = call @llvm.vp.merge.nxv16bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vf_nxv16bf16(bfloat %a, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vf_nxv16bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: fmv.x.h a1, fa0 ; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma ; CHECK-NEXT: vmv.v.x v12, a1 ; CHECK-NEXT: vsetvli zero, zero, e16, m4, tu, ma ; CHECK-NEXT: vmerge.vvm v8, v8, v12, v0 ; CHECK-NEXT: ret %elt.head = insertelement poison, bfloat %a, i32 0 %va = shufflevector %elt.head, poison, zeroinitializer %v = call @llvm.vp.merge.nxv16bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vv_nxv32bf16( %va, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vv_nxv32bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, ma ; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0 ; CHECK-NEXT: vmv8r.v v8, v16 ; CHECK-NEXT: ret %v = call @llvm.vp.merge.nxv32bf16( %m, %va, %vb, i32 %evl) ret %v } define @vpmerge_vf_nxv32bf16(bfloat %a, %vb, %m, i32 zeroext %evl) { ; CHECK-LABEL: vpmerge_vf_nxv32bf16: ; CHECK: # %bb.0: ; CHECK-NEXT: fmv.x.h a1, fa0 ; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma ; CHECK-NEXT: vmv.v.x v16, a1 ; CHECK-NEXT: vsetvli zero, zero, e16, m8, tu, ma ; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 ; CHECK-NEXT: ret %elt.head = insertelement poison, bfloat %a, i32 0 %va = shufflevector %elt.head, poison, zeroinitializer %v = call @llvm.vp.merge.nxv32bf16( %m, %va, %vb, i32 %evl) ret %v }