166 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+v,+m,+zfbfmin,+zvfbfmin -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+d,+v,+m,+zfbfmin,+zvfbfmin -target-abi=lp64d \5; RUN: -verify-machineinstrs < %s | FileCheck %s6; RUN: llc -mtriple=riscv32 -mattr=+d,+v,+zvfh,+m,+zfbfmin,+zvfbfmin -target-abi=ilp32d \7; RUN: -verify-machineinstrs < %s | FileCheck %s8; RUN: llc -mtriple=riscv64 -mattr=+d,+v,+zvfh,+m,+zfbfmin,+zvfbfmin -target-abi=lp64d \9; RUN: -verify-machineinstrs < %s | FileCheck %s10 11define <vscale x 1 x bfloat> @vpmerge_vv_nxv1bf16(<vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {12; CHECK-LABEL: vpmerge_vv_nxv1bf16:13; CHECK: # %bb.0:14; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma15; CHECK-NEXT: vmerge.vvm v9, v9, v8, v016; CHECK-NEXT: vmv1r.v v8, v917; CHECK-NEXT: ret18 %v = call <vscale x 1 x bfloat> @llvm.vp.merge.nxv1bf16(<vscale x 1 x i1> %m, <vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, i32 %evl)19 ret <vscale x 1 x bfloat> %v20}21 22define <vscale x 1 x bfloat> @vpmerge_vf_nxv1bf16(bfloat %a, <vscale x 1 x bfloat> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {23; CHECK-LABEL: vpmerge_vf_nxv1bf16:24; CHECK: # %bb.0:25; CHECK-NEXT: fmv.x.h a1, fa026; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma27; CHECK-NEXT: vmv.v.x v9, a128; CHECK-NEXT: vsetvli zero, zero, e16, mf4, tu, ma29; CHECK-NEXT: vmerge.vvm v8, v8, v9, v030; CHECK-NEXT: ret31 %elt.head = insertelement <vscale x 1 x bfloat> poison, bfloat %a, i32 032 %va = shufflevector <vscale x 1 x bfloat> %elt.head, <vscale x 1 x bfloat> poison, <vscale x 1 x i32> zeroinitializer33 %v = call <vscale x 1 x bfloat> @llvm.vp.merge.nxv1bf16(<vscale x 1 x i1> %m, <vscale x 1 x bfloat> %va, <vscale x 1 x bfloat> %vb, i32 %evl)34 ret <vscale x 1 x bfloat> %v35}36 37define <vscale x 2 x bfloat> @vpmerge_vv_nxv2bf16(<vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {38; CHECK-LABEL: vpmerge_vv_nxv2bf16:39; CHECK: # %bb.0:40; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma41; CHECK-NEXT: vmerge.vvm v9, v9, v8, v042; CHECK-NEXT: vmv1r.v v8, v943; CHECK-NEXT: ret44 %v = call <vscale x 2 x bfloat> @llvm.vp.merge.nxv2bf16(<vscale x 2 x i1> %m, <vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb, i32 %evl)45 ret <vscale x 2 x bfloat> %v46}47 48define <vscale x 2 x bfloat> @vpmerge_vf_nxv2bf16(bfloat %a, <vscale x 2 x bfloat> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {49; CHECK-LABEL: vpmerge_vf_nxv2bf16:50; CHECK: # %bb.0:51; CHECK-NEXT: fmv.x.h a1, fa052; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma53; CHECK-NEXT: vmv.v.x v9, a154; CHECK-NEXT: vsetvli zero, zero, e16, mf2, tu, ma55; CHECK-NEXT: vmerge.vvm v8, v8, v9, v056; CHECK-NEXT: ret57 %elt.head = insertelement <vscale x 2 x bfloat> poison, bfloat %a, i32 058 %va = shufflevector <vscale x 2 x bfloat> %elt.head, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer59 %v = call <vscale x 2 x bfloat> @llvm.vp.merge.nxv2bf16(<vscale x 2 x i1> %m, <vscale x 2 x bfloat> %va, <vscale x 2 x bfloat> %vb, i32 %evl)60 ret <vscale x 2 x bfloat> %v61}62 63define <vscale x 4 x bfloat> @vpmerge_vv_nxv4bf16(<vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {64; CHECK-LABEL: vpmerge_vv_nxv4bf16:65; CHECK: # %bb.0:66; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma67; CHECK-NEXT: vmerge.vvm v9, v9, v8, v068; CHECK-NEXT: vmv1r.v v8, v969; CHECK-NEXT: ret70 %v = call <vscale x 4 x bfloat> @llvm.vp.merge.nxv4bf16(<vscale x 4 x i1> %m, <vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb, i32 %evl)71 ret <vscale x 4 x bfloat> %v72}73 74define <vscale x 4 x bfloat> @vpmerge_vf_nxv4bf16(bfloat %a, <vscale x 4 x bfloat> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {75; CHECK-LABEL: vpmerge_vf_nxv4bf16:76; CHECK: # %bb.0:77; CHECK-NEXT: fmv.x.h a1, fa078; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma79; CHECK-NEXT: vmv.v.x v9, a180; CHECK-NEXT: vsetvli zero, zero, e16, m1, tu, ma81; CHECK-NEXT: vmerge.vvm v8, v8, v9, v082; CHECK-NEXT: ret83 %elt.head = insertelement <vscale x 4 x bfloat> poison, bfloat %a, i32 084 %va = shufflevector <vscale x 4 x bfloat> %elt.head, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer85 %v = call <vscale x 4 x bfloat> @llvm.vp.merge.nxv4bf16(<vscale x 4 x i1> %m, <vscale x 4 x bfloat> %va, <vscale x 4 x bfloat> %vb, i32 %evl)86 ret <vscale x 4 x bfloat> %v87}88 89define <vscale x 8 x bfloat> @vpmerge_vv_nxv8bf16(<vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {90; CHECK-LABEL: vpmerge_vv_nxv8bf16:91; CHECK: # %bb.0:92; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma93; CHECK-NEXT: vmerge.vvm v10, v10, v8, v094; CHECK-NEXT: vmv2r.v v8, v1095; CHECK-NEXT: ret96 %v = call <vscale x 8 x bfloat> @llvm.vp.merge.nxv8bf16(<vscale x 8 x i1> %m, <vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb, i32 %evl)97 ret <vscale x 8 x bfloat> %v98}99 100define <vscale x 8 x bfloat> @vpmerge_vf_nxv8bf16(bfloat %a, <vscale x 8 x bfloat> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {101; CHECK-LABEL: vpmerge_vf_nxv8bf16:102; CHECK: # %bb.0:103; CHECK-NEXT: fmv.x.h a1, fa0104; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma105; CHECK-NEXT: vmv.v.x v10, a1106; CHECK-NEXT: vsetvli zero, zero, e16, m2, tu, ma107; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0108; CHECK-NEXT: ret109 %elt.head = insertelement <vscale x 8 x bfloat> poison, bfloat %a, i32 0110 %va = shufflevector <vscale x 8 x bfloat> %elt.head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer111 %v = call <vscale x 8 x bfloat> @llvm.vp.merge.nxv8bf16(<vscale x 8 x i1> %m, <vscale x 8 x bfloat> %va, <vscale x 8 x bfloat> %vb, i32 %evl)112 ret <vscale x 8 x bfloat> %v113}114 115define <vscale x 16 x bfloat> @vpmerge_vv_nxv16bf16(<vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {116; CHECK-LABEL: vpmerge_vv_nxv16bf16:117; CHECK: # %bb.0:118; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, ma119; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0120; CHECK-NEXT: vmv4r.v v8, v12121; CHECK-NEXT: ret122 %v = call <vscale x 16 x bfloat> @llvm.vp.merge.nxv16bf16(<vscale x 16 x i1> %m, <vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, i32 %evl)123 ret <vscale x 16 x bfloat> %v124}125 126define <vscale x 16 x bfloat> @vpmerge_vf_nxv16bf16(bfloat %a, <vscale x 16 x bfloat> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {127; CHECK-LABEL: vpmerge_vf_nxv16bf16:128; CHECK: # %bb.0:129; CHECK-NEXT: fmv.x.h a1, fa0130; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma131; CHECK-NEXT: vmv.v.x v12, a1132; CHECK-NEXT: vsetvli zero, zero, e16, m4, tu, ma133; CHECK-NEXT: vmerge.vvm v8, v8, v12, v0134; CHECK-NEXT: ret135 %elt.head = insertelement <vscale x 16 x bfloat> poison, bfloat %a, i32 0136 %va = shufflevector <vscale x 16 x bfloat> %elt.head, <vscale x 16 x bfloat> poison, <vscale x 16 x i32> zeroinitializer137 %v = call <vscale x 16 x bfloat> @llvm.vp.merge.nxv16bf16(<vscale x 16 x i1> %m, <vscale x 16 x bfloat> %va, <vscale x 16 x bfloat> %vb, i32 %evl)138 ret <vscale x 16 x bfloat> %v139}140 141define <vscale x 32 x bfloat> @vpmerge_vv_nxv32bf16(<vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {142; CHECK-LABEL: vpmerge_vv_nxv32bf16:143; CHECK: # %bb.0:144; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, ma145; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0146; CHECK-NEXT: vmv8r.v v8, v16147; CHECK-NEXT: ret148 %v = call <vscale x 32 x bfloat> @llvm.vp.merge.nxv32bf16(<vscale x 32 x i1> %m, <vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb, i32 %evl)149 ret <vscale x 32 x bfloat> %v150}151 152define <vscale x 32 x bfloat> @vpmerge_vf_nxv32bf16(bfloat %a, <vscale x 32 x bfloat> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {153; CHECK-LABEL: vpmerge_vf_nxv32bf16:154; CHECK: # %bb.0:155; CHECK-NEXT: fmv.x.h a1, fa0156; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma157; CHECK-NEXT: vmv.v.x v16, a1158; CHECK-NEXT: vsetvli zero, zero, e16, m8, tu, ma159; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0160; CHECK-NEXT: ret161 %elt.head = insertelement <vscale x 32 x bfloat> poison, bfloat %a, i32 0162 %va = shufflevector <vscale x 32 x bfloat> %elt.head, <vscale x 32 x bfloat> poison, <vscale x 32 x i32> zeroinitializer163 %v = call <vscale x 32 x bfloat> @llvm.vp.merge.nxv32bf16(<vscale x 32 x i1> %m, <vscale x 32 x bfloat> %va, <vscale x 32 x bfloat> %vb, i32 %evl)164 ret <vscale x 32 x bfloat> %v165}166