1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+experimental-zvfh,+v,+m -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+experimental-zvfh,+v,+m -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 6 7declare <vscale x 1 x i1> @llvm.vp.merge.nxv1i1(<vscale x 1 x i1>, <vscale x 1 x i1>, <vscale x 1 x i1>, i32) 8 9define <vscale x 1 x i1> @vpmerge_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 10; RV32-LABEL: vpmerge_nxv1i1: 11; RV32: # %bb.0: 12; RV32-NEXT: vsetvli a1, zero, e32, mf2, ta, mu 13; RV32-NEXT: vid.v v10 14; RV32-NEXT: vmsltu.vx v10, v10, a0 15; RV32-NEXT: vmand.mm v9, v9, v10 16; RV32-NEXT: vmandn.mm v8, v8, v9 17; RV32-NEXT: vmand.mm v9, v0, v9 18; RV32-NEXT: vmor.mm v0, v9, v8 19; RV32-NEXT: ret 20; 21; RV64-LABEL: vpmerge_nxv1i1: 22; RV64: # %bb.0: 23; RV64-NEXT: vsetvli a1, zero, e64, m1, ta, mu 24; RV64-NEXT: vid.v v10 25; RV64-NEXT: vmsltu.vx v10, v10, a0 26; RV64-NEXT: vmand.mm v9, v9, v10 27; RV64-NEXT: vmandn.mm v8, v8, v9 28; RV64-NEXT: vmand.mm v9, v0, v9 29; RV64-NEXT: vmor.mm v0, v9, v8 30; RV64-NEXT: ret 31 %v = call <vscale x 1 x i1> @llvm.vp.merge.nxv1i1(<vscale x 1 x i1> %m, <vscale x 1 x i1> %va, <vscale x 1 x i1> %vb, i32 %evl) 32 ret <vscale x 1 x i1> %v 33} 34 35declare <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1>, <vscale x 1 x i8>, <vscale x 1 x i8>, i32) 36 37define <vscale x 1 x i8> @vpmerge_vv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 38; CHECK-LABEL: vpmerge_vv_nxv1i8: 39; CHECK: # %bb.0: 40; CHECK-NEXT: vsetvli zero, a0, e8, mf8, tu, mu 41; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 42; CHECK-NEXT: vmv1r.v v8, v9 43; CHECK-NEXT: ret 44 %v = call <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1> %m, <vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, i32 %evl) 45 ret <vscale x 1 x i8> %v 46} 47 48define <vscale x 1 x i8> @vpmerge_vx_nxv1i8(i8 %a, <vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 49; CHECK-LABEL: vpmerge_vx_nxv1i8: 50; CHECK: # %bb.0: 51; CHECK-NEXT: vsetvli zero, a1, e8, mf8, tu, mu 52; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 53; CHECK-NEXT: ret 54 %elt.head = insertelement <vscale x 1 x i8> poison, i8 %a, i32 0 55 %va = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 56 %v = call <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1> %m, <vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, i32 %evl) 57 ret <vscale x 1 x i8> %v 58} 59 60define <vscale x 1 x i8> @vpmerge_vi_nxv1i8(<vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 61; CHECK-LABEL: vpmerge_vi_nxv1i8: 62; CHECK: # %bb.0: 63; CHECK-NEXT: vsetvli zero, a0, e8, mf8, tu, mu 64; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 65; CHECK-NEXT: ret 66 %elt.head = insertelement <vscale x 1 x i8> poison, i8 2, i32 0 67 %va = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 68 %v = call <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1> %m, <vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, i32 %evl) 69 ret <vscale x 1 x i8> %v 70} 71 72declare <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1>, <vscale x 2 x i8>, <vscale x 2 x i8>, i32) 73 74define <vscale x 2 x i8> @vpmerge_vv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 75; CHECK-LABEL: vpmerge_vv_nxv2i8: 76; CHECK: # %bb.0: 77; CHECK-NEXT: vsetvli zero, a0, e8, mf4, tu, mu 78; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 79; CHECK-NEXT: vmv1r.v v8, v9 80; CHECK-NEXT: ret 81 %v = call <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1> %m, <vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, i32 %evl) 82 ret <vscale x 2 x i8> %v 83} 84 85define <vscale x 2 x i8> @vpmerge_vx_nxv2i8(i8 %a, <vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 86; CHECK-LABEL: vpmerge_vx_nxv2i8: 87; CHECK: # %bb.0: 88; CHECK-NEXT: vsetvli zero, a1, e8, mf4, tu, mu 89; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 90; CHECK-NEXT: ret 91 %elt.head = insertelement <vscale x 2 x i8> poison, i8 %a, i32 0 92 %va = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 93 %v = call <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1> %m, <vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, i32 %evl) 94 ret <vscale x 2 x i8> %v 95} 96 97define <vscale x 2 x i8> @vpmerge_vi_nxv2i8(<vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 98; CHECK-LABEL: vpmerge_vi_nxv2i8: 99; CHECK: # %bb.0: 100; CHECK-NEXT: vsetvli zero, a0, e8, mf4, tu, mu 101; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 102; CHECK-NEXT: ret 103 %elt.head = insertelement <vscale x 2 x i8> poison, i8 2, i32 0 104 %va = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 105 %v = call <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1> %m, <vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, i32 %evl) 106 ret <vscale x 2 x i8> %v 107} 108 109declare <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1>, <vscale x 3 x i8>, <vscale x 3 x i8>, i32) 110 111define <vscale x 3 x i8> @vpmerge_vv_nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 zeroext %evl) { 112; CHECK-LABEL: vpmerge_vv_nxv3i8: 113; CHECK: # %bb.0: 114; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, mu 115; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 116; CHECK-NEXT: vmv1r.v v8, v9 117; CHECK-NEXT: ret 118 %v = call <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1> %m, <vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, i32 %evl) 119 ret <vscale x 3 x i8> %v 120} 121 122define <vscale x 3 x i8> @vpmerge_vx_nxv3i8(i8 %a, <vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 zeroext %evl) { 123; CHECK-LABEL: vpmerge_vx_nxv3i8: 124; CHECK: # %bb.0: 125; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, mu 126; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 127; CHECK-NEXT: ret 128 %elt.head = insertelement <vscale x 3 x i8> poison, i8 %a, i32 0 129 %va = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer 130 %v = call <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1> %m, <vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, i32 %evl) 131 ret <vscale x 3 x i8> %v 132} 133 134define <vscale x 3 x i8> @vpmerge_vi_nxv3i8(<vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 zeroext %evl) { 135; CHECK-LABEL: vpmerge_vi_nxv3i8: 136; CHECK: # %bb.0: 137; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, mu 138; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 139; CHECK-NEXT: ret 140 %elt.head = insertelement <vscale x 3 x i8> poison, i8 2, i32 0 141 %va = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer 142 %v = call <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1> %m, <vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, i32 %evl) 143 ret <vscale x 3 x i8> %v 144} 145 146declare <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1>, <vscale x 4 x i8>, <vscale x 4 x i8>, i32) 147 148define <vscale x 4 x i8> @vpmerge_vv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 149; CHECK-LABEL: vpmerge_vv_nxv4i8: 150; CHECK: # %bb.0: 151; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, mu 152; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 153; CHECK-NEXT: vmv1r.v v8, v9 154; CHECK-NEXT: ret 155 %v = call <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1> %m, <vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, i32 %evl) 156 ret <vscale x 4 x i8> %v 157} 158 159define <vscale x 4 x i8> @vpmerge_vx_nxv4i8(i8 %a, <vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 160; CHECK-LABEL: vpmerge_vx_nxv4i8: 161; CHECK: # %bb.0: 162; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, mu 163; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 164; CHECK-NEXT: ret 165 %elt.head = insertelement <vscale x 4 x i8> poison, i8 %a, i32 0 166 %va = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 167 %v = call <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1> %m, <vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, i32 %evl) 168 ret <vscale x 4 x i8> %v 169} 170 171define <vscale x 4 x i8> @vpmerge_vi_nxv4i8(<vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 172; CHECK-LABEL: vpmerge_vi_nxv4i8: 173; CHECK: # %bb.0: 174; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, mu 175; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 176; CHECK-NEXT: ret 177 %elt.head = insertelement <vscale x 4 x i8> poison, i8 2, i32 0 178 %va = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 179 %v = call <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1> %m, <vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, i32 %evl) 180 ret <vscale x 4 x i8> %v 181} 182 183declare <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1>, <vscale x 8 x i7>, <vscale x 8 x i7>, i32) 184 185define <vscale x 8 x i7> @vpmerge_vv_nxv8i7(<vscale x 8 x i7> %va, <vscale x 8 x i7> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 186; CHECK-LABEL: vpmerge_vv_nxv8i7: 187; CHECK: # %bb.0: 188; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, mu 189; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 190; CHECK-NEXT: vmv1r.v v8, v9 191; CHECK-NEXT: ret 192 %v = call <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1> %m, <vscale x 8 x i7> %va, <vscale x 8 x i7> %vb, i32 %evl) 193 ret <vscale x 8 x i7> %v 194} 195 196define <vscale x 8 x i7> @vpmerge_vx_nxv8i7(i7 %a, <vscale x 8 x i7> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 197; CHECK-LABEL: vpmerge_vx_nxv8i7: 198; CHECK: # %bb.0: 199; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, mu 200; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 201; CHECK-NEXT: ret 202 %elt.head = insertelement <vscale x 8 x i7> poison, i7 %a, i32 0 203 %va = shufflevector <vscale x 8 x i7> %elt.head, <vscale x 8 x i7> poison, <vscale x 8 x i32> zeroinitializer 204 %v = call <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1> %m, <vscale x 8 x i7> %va, <vscale x 8 x i7> %vb, i32 %evl) 205 ret <vscale x 8 x i7> %v 206} 207 208define <vscale x 8 x i7> @vpmerge_vi_nxv8i7(<vscale x 8 x i7> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 209; CHECK-LABEL: vpmerge_vi_nxv8i7: 210; CHECK: # %bb.0: 211; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, mu 212; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 213; CHECK-NEXT: ret 214 %elt.head = insertelement <vscale x 8 x i7> poison, i7 2, i32 0 215 %va = shufflevector <vscale x 8 x i7> %elt.head, <vscale x 8 x i7> poison, <vscale x 8 x i32> zeroinitializer 216 %v = call <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1> %m, <vscale x 8 x i7> %va, <vscale x 8 x i7> %vb, i32 %evl) 217 ret <vscale x 8 x i7> %v 218} 219 220declare <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1>, <vscale x 8 x i8>, <vscale x 8 x i8>, i32) 221 222define <vscale x 8 x i8> @vpmerge_vv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 223; CHECK-LABEL: vpmerge_vv_nxv8i8: 224; CHECK: # %bb.0: 225; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, mu 226; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 227; CHECK-NEXT: vmv1r.v v8, v9 228; CHECK-NEXT: ret 229 %v = call <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1> %m, <vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, i32 %evl) 230 ret <vscale x 8 x i8> %v 231} 232 233define <vscale x 8 x i8> @vpmerge_vx_nxv8i8(i8 %a, <vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 234; CHECK-LABEL: vpmerge_vx_nxv8i8: 235; CHECK: # %bb.0: 236; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, mu 237; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 238; CHECK-NEXT: ret 239 %elt.head = insertelement <vscale x 8 x i8> poison, i8 %a, i32 0 240 %va = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 241 %v = call <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1> %m, <vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, i32 %evl) 242 ret <vscale x 8 x i8> %v 243} 244 245define <vscale x 8 x i8> @vpmerge_vi_nxv8i8(<vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 246; CHECK-LABEL: vpmerge_vi_nxv8i8: 247; CHECK: # %bb.0: 248; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, mu 249; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 250; CHECK-NEXT: ret 251 %elt.head = insertelement <vscale x 8 x i8> poison, i8 2, i32 0 252 %va = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 253 %v = call <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1> %m, <vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, i32 %evl) 254 ret <vscale x 8 x i8> %v 255} 256 257declare <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32) 258 259define <vscale x 16 x i8> @vpmerge_vv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 260; CHECK-LABEL: vpmerge_vv_nxv16i8: 261; CHECK: # %bb.0: 262; CHECK-NEXT: vsetvli zero, a0, e8, m2, tu, mu 263; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0 264; CHECK-NEXT: vmv2r.v v8, v10 265; CHECK-NEXT: ret 266 %v = call <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1> %m, <vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, i32 %evl) 267 ret <vscale x 16 x i8> %v 268} 269 270define <vscale x 16 x i8> @vpmerge_vx_nxv16i8(i8 %a, <vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 271; CHECK-LABEL: vpmerge_vx_nxv16i8: 272; CHECK: # %bb.0: 273; CHECK-NEXT: vsetvli zero, a1, e8, m2, tu, mu 274; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 275; CHECK-NEXT: ret 276 %elt.head = insertelement <vscale x 16 x i8> poison, i8 %a, i32 0 277 %va = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 278 %v = call <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1> %m, <vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, i32 %evl) 279 ret <vscale x 16 x i8> %v 280} 281 282define <vscale x 16 x i8> @vpmerge_vi_nxv16i8(<vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 283; CHECK-LABEL: vpmerge_vi_nxv16i8: 284; CHECK: # %bb.0: 285; CHECK-NEXT: vsetvli zero, a0, e8, m2, tu, mu 286; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 287; CHECK-NEXT: ret 288 %elt.head = insertelement <vscale x 16 x i8> poison, i8 2, i32 0 289 %va = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 290 %v = call <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1> %m, <vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, i32 %evl) 291 ret <vscale x 16 x i8> %v 292} 293 294declare <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1>, <vscale x 32 x i8>, <vscale x 32 x i8>, i32) 295 296define <vscale x 32 x i8> @vpmerge_vv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) { 297; CHECK-LABEL: vpmerge_vv_nxv32i8: 298; CHECK: # %bb.0: 299; CHECK-NEXT: vsetvli zero, a0, e8, m4, tu, mu 300; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0 301; CHECK-NEXT: vmv4r.v v8, v12 302; CHECK-NEXT: ret 303 %v = call <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1> %m, <vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, i32 %evl) 304 ret <vscale x 32 x i8> %v 305} 306 307define <vscale x 32 x i8> @vpmerge_vx_nxv32i8(i8 %a, <vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) { 308; CHECK-LABEL: vpmerge_vx_nxv32i8: 309; CHECK: # %bb.0: 310; CHECK-NEXT: vsetvli zero, a1, e8, m4, tu, mu 311; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 312; CHECK-NEXT: ret 313 %elt.head = insertelement <vscale x 32 x i8> poison, i8 %a, i32 0 314 %va = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 315 %v = call <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1> %m, <vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, i32 %evl) 316 ret <vscale x 32 x i8> %v 317} 318 319define <vscale x 32 x i8> @vpmerge_vi_nxv32i8(<vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) { 320; CHECK-LABEL: vpmerge_vi_nxv32i8: 321; CHECK: # %bb.0: 322; CHECK-NEXT: vsetvli zero, a0, e8, m4, tu, mu 323; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 324; CHECK-NEXT: ret 325 %elt.head = insertelement <vscale x 32 x i8> poison, i8 2, i32 0 326 %va = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 327 %v = call <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1> %m, <vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, i32 %evl) 328 ret <vscale x 32 x i8> %v 329} 330 331declare <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1>, <vscale x 64 x i8>, <vscale x 64 x i8>, i32) 332 333define <vscale x 64 x i8> @vpmerge_vv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 zeroext %evl) { 334; CHECK-LABEL: vpmerge_vv_nxv64i8: 335; CHECK: # %bb.0: 336; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, mu 337; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0 338; CHECK-NEXT: vmv8r.v v8, v16 339; CHECK-NEXT: ret 340 %v = call <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1> %m, <vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, i32 %evl) 341 ret <vscale x 64 x i8> %v 342} 343 344define <vscale x 64 x i8> @vpmerge_vx_nxv64i8(i8 %a, <vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 zeroext %evl) { 345; CHECK-LABEL: vpmerge_vx_nxv64i8: 346; CHECK: # %bb.0: 347; CHECK-NEXT: vsetvli zero, a1, e8, m8, tu, mu 348; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 349; CHECK-NEXT: ret 350 %elt.head = insertelement <vscale x 64 x i8> poison, i8 %a, i32 0 351 %va = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 352 %v = call <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1> %m, <vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, i32 %evl) 353 ret <vscale x 64 x i8> %v 354} 355 356define <vscale x 64 x i8> @vpmerge_vi_nxv64i8(<vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 zeroext %evl) { 357; CHECK-LABEL: vpmerge_vi_nxv64i8: 358; CHECK: # %bb.0: 359; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, mu 360; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 361; CHECK-NEXT: ret 362 %elt.head = insertelement <vscale x 64 x i8> poison, i8 2, i32 0 363 %va = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 364 %v = call <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1> %m, <vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, i32 %evl) 365 ret <vscale x 64 x i8> %v 366} 367 368declare <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1>, <vscale x 128 x i8>, <vscale x 128 x i8>, i32) 369 370define <vscale x 128 x i8> @vpmerge_vv_nxv128i8(<vscale x 128 x i8> %va, <vscale x 128 x i8> %vb, <vscale x 128 x i1> %m, i32 zeroext %evl) { 371; RV32-LABEL: vpmerge_vv_nxv128i8: 372; RV32: # %bb.0: 373; RV32-NEXT: addi sp, sp, -16 374; RV32-NEXT: .cfi_def_cfa_offset 16 375; RV32-NEXT: csrr a1, vlenb 376; RV32-NEXT: li a4, 24 377; RV32-NEXT: mul a1, a1, a4 378; RV32-NEXT: sub sp, sp, a1 379; RV32-NEXT: csrr a1, vlenb 380; RV32-NEXT: slli a1, a1, 3 381; RV32-NEXT: add a4, a0, a1 382; RV32-NEXT: vl8r.v v24, (a4) 383; RV32-NEXT: csrr a4, vlenb 384; RV32-NEXT: slli a4, a4, 3 385; RV32-NEXT: add a4, sp, a4 386; RV32-NEXT: addi a4, a4, 16 387; RV32-NEXT: vs8r.v v24, (a4) # Unknown-size Folded Spill 388; RV32-NEXT: vsetvli a4, zero, e8, m8, ta, mu 389; RV32-NEXT: vlm.v v2, (a2) 390; RV32-NEXT: sub a4, a3, a1 391; RV32-NEXT: vmv1r.v v1, v0 392; RV32-NEXT: csrr a2, vlenb 393; RV32-NEXT: slli a2, a2, 4 394; RV32-NEXT: add a2, sp, a2 395; RV32-NEXT: addi a2, a2, 16 396; RV32-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill 397; RV32-NEXT: addi a2, sp, 16 398; RV32-NEXT: vs8r.v v8, (a2) # Unknown-size Folded Spill 399; RV32-NEXT: li a2, 0 400; RV32-NEXT: bltu a3, a4, .LBB28_2 401; RV32-NEXT: # %bb.1: 402; RV32-NEXT: mv a2, a4 403; RV32-NEXT: .LBB28_2: 404; RV32-NEXT: vl8r.v v8, (a0) 405; RV32-NEXT: vsetvli zero, a2, e8, m8, tu, mu 406; RV32-NEXT: vmv1r.v v0, v2 407; RV32-NEXT: csrr a0, vlenb 408; RV32-NEXT: slli a0, a0, 4 409; RV32-NEXT: add a0, sp, a0 410; RV32-NEXT: addi a0, a0, 16 411; RV32-NEXT: vl8re8.v v24, (a0) # Unknown-size Folded Reload 412; RV32-NEXT: csrr a0, vlenb 413; RV32-NEXT: slli a0, a0, 3 414; RV32-NEXT: add a0, sp, a0 415; RV32-NEXT: addi a0, a0, 16 416; RV32-NEXT: vl8re8.v v16, (a0) # Unknown-size Folded Reload 417; RV32-NEXT: vmerge.vvm v16, v16, v24, v0 418; RV32-NEXT: bltu a3, a1, .LBB28_4 419; RV32-NEXT: # %bb.3: 420; RV32-NEXT: mv a3, a1 421; RV32-NEXT: .LBB28_4: 422; RV32-NEXT: vsetvli zero, a3, e8, m8, tu, mu 423; RV32-NEXT: vmv1r.v v0, v1 424; RV32-NEXT: addi a0, sp, 16 425; RV32-NEXT: vl8re8.v v24, (a0) # Unknown-size Folded Reload 426; RV32-NEXT: vmerge.vvm v8, v8, v24, v0 427; RV32-NEXT: csrr a0, vlenb 428; RV32-NEXT: li a1, 24 429; RV32-NEXT: mul a0, a0, a1 430; RV32-NEXT: add sp, sp, a0 431; RV32-NEXT: addi sp, sp, 16 432; RV32-NEXT: ret 433; 434; RV64-LABEL: vpmerge_vv_nxv128i8: 435; RV64: # %bb.0: 436; RV64-NEXT: addi sp, sp, -16 437; RV64-NEXT: .cfi_def_cfa_offset 16 438; RV64-NEXT: csrr a1, vlenb 439; RV64-NEXT: slli a1, a1, 3 440; RV64-NEXT: sub sp, sp, a1 441; RV64-NEXT: csrr a1, vlenb 442; RV64-NEXT: slli a1, a1, 3 443; RV64-NEXT: add a4, a0, a1 444; RV64-NEXT: vl8r.v v24, (a4) 445; RV64-NEXT: vsetvli a4, zero, e8, m8, ta, mu 446; RV64-NEXT: vlm.v v2, (a2) 447; RV64-NEXT: sub a4, a3, a1 448; RV64-NEXT: vmv1r.v v1, v0 449; RV64-NEXT: addi a2, sp, 16 450; RV64-NEXT: vs8r.v v8, (a2) # Unknown-size Folded Spill 451; RV64-NEXT: li a2, 0 452; RV64-NEXT: bltu a3, a4, .LBB28_2 453; RV64-NEXT: # %bb.1: 454; RV64-NEXT: mv a2, a4 455; RV64-NEXT: .LBB28_2: 456; RV64-NEXT: vl8r.v v8, (a0) 457; RV64-NEXT: vsetvli zero, a2, e8, m8, tu, mu 458; RV64-NEXT: vmv1r.v v0, v2 459; RV64-NEXT: vmerge.vvm v24, v24, v16, v0 460; RV64-NEXT: bltu a3, a1, .LBB28_4 461; RV64-NEXT: # %bb.3: 462; RV64-NEXT: mv a3, a1 463; RV64-NEXT: .LBB28_4: 464; RV64-NEXT: vsetvli zero, a3, e8, m8, tu, mu 465; RV64-NEXT: vmv1r.v v0, v1 466; RV64-NEXT: addi a0, sp, 16 467; RV64-NEXT: vl8re8.v v16, (a0) # Unknown-size Folded Reload 468; RV64-NEXT: vmerge.vvm v8, v8, v16, v0 469; RV64-NEXT: vmv8r.v v16, v24 470; RV64-NEXT: csrr a0, vlenb 471; RV64-NEXT: slli a0, a0, 3 472; RV64-NEXT: add sp, sp, a0 473; RV64-NEXT: addi sp, sp, 16 474; RV64-NEXT: ret 475 %v = call <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1> %m, <vscale x 128 x i8> %va, <vscale x 128 x i8> %vb, i32 %evl) 476 ret <vscale x 128 x i8> %v 477} 478 479define <vscale x 128 x i8> @vpmerge_vx_nxv128i8(i8 %a, <vscale x 128 x i8> %vb, <vscale x 128 x i1> %m, i32 zeroext %evl) { 480; CHECK-LABEL: vpmerge_vx_nxv128i8: 481; CHECK: # %bb.0: 482; CHECK-NEXT: csrr a3, vlenb 483; CHECK-NEXT: slli a3, a3, 3 484; CHECK-NEXT: mv a4, a2 485; CHECK-NEXT: bltu a2, a3, .LBB29_2 486; CHECK-NEXT: # %bb.1: 487; CHECK-NEXT: mv a4, a3 488; CHECK-NEXT: .LBB29_2: 489; CHECK-NEXT: li a5, 0 490; CHECK-NEXT: vsetvli a6, zero, e8, m8, ta, mu 491; CHECK-NEXT: vlm.v v24, (a1) 492; CHECK-NEXT: vsetvli zero, a4, e8, m8, tu, mu 493; CHECK-NEXT: sub a1, a2, a3 494; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 495; CHECK-NEXT: bltu a2, a1, .LBB29_4 496; CHECK-NEXT: # %bb.3: 497; CHECK-NEXT: mv a5, a1 498; CHECK-NEXT: .LBB29_4: 499; CHECK-NEXT: vsetvli zero, a5, e8, m8, tu, mu 500; CHECK-NEXT: vmv1r.v v0, v24 501; CHECK-NEXT: vmerge.vxm v16, v16, a0, v0 502; CHECK-NEXT: ret 503 %elt.head = insertelement <vscale x 128 x i8> poison, i8 %a, i32 0 504 %va = shufflevector <vscale x 128 x i8> %elt.head, <vscale x 128 x i8> poison, <vscale x 128 x i32> zeroinitializer 505 %v = call <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1> %m, <vscale x 128 x i8> %va, <vscale x 128 x i8> %vb, i32 %evl) 506 ret <vscale x 128 x i8> %v 507} 508 509define <vscale x 128 x i8> @vpmerge_vi_nxv128i8(<vscale x 128 x i8> %vb, <vscale x 128 x i1> %m, i32 zeroext %evl) { 510; CHECK-LABEL: vpmerge_vi_nxv128i8: 511; CHECK: # %bb.0: 512; CHECK-NEXT: csrr a2, vlenb 513; CHECK-NEXT: slli a2, a2, 3 514; CHECK-NEXT: mv a3, a1 515; CHECK-NEXT: bltu a1, a2, .LBB30_2 516; CHECK-NEXT: # %bb.1: 517; CHECK-NEXT: mv a3, a2 518; CHECK-NEXT: .LBB30_2: 519; CHECK-NEXT: li a4, 0 520; CHECK-NEXT: vsetvli a5, zero, e8, m8, ta, mu 521; CHECK-NEXT: vlm.v v24, (a0) 522; CHECK-NEXT: vsetvli zero, a3, e8, m8, tu, mu 523; CHECK-NEXT: sub a0, a1, a2 524; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 525; CHECK-NEXT: bltu a1, a0, .LBB30_4 526; CHECK-NEXT: # %bb.3: 527; CHECK-NEXT: mv a4, a0 528; CHECK-NEXT: .LBB30_4: 529; CHECK-NEXT: vsetvli zero, a4, e8, m8, tu, mu 530; CHECK-NEXT: vmv1r.v v0, v24 531; CHECK-NEXT: vmerge.vim v16, v16, 2, v0 532; CHECK-NEXT: ret 533 %elt.head = insertelement <vscale x 128 x i8> poison, i8 2, i32 0 534 %va = shufflevector <vscale x 128 x i8> %elt.head, <vscale x 128 x i8> poison, <vscale x 128 x i32> zeroinitializer 535 %v = call <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1> %m, <vscale x 128 x i8> %va, <vscale x 128 x i8> %vb, i32 %evl) 536 ret <vscale x 128 x i8> %v 537} 538 539declare <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1>, <vscale x 1 x i16>, <vscale x 1 x i16>, i32) 540 541define <vscale x 1 x i16> @vpmerge_vv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 542; CHECK-LABEL: vpmerge_vv_nxv1i16: 543; CHECK: # %bb.0: 544; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, mu 545; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 546; CHECK-NEXT: vmv1r.v v8, v9 547; CHECK-NEXT: ret 548 %v = call <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1> %m, <vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, i32 %evl) 549 ret <vscale x 1 x i16> %v 550} 551 552define <vscale x 1 x i16> @vpmerge_vx_nxv1i16(i16 %a, <vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 553; CHECK-LABEL: vpmerge_vx_nxv1i16: 554; CHECK: # %bb.0: 555; CHECK-NEXT: vsetvli zero, a1, e16, mf4, tu, mu 556; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 557; CHECK-NEXT: ret 558 %elt.head = insertelement <vscale x 1 x i16> poison, i16 %a, i32 0 559 %va = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 560 %v = call <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1> %m, <vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, i32 %evl) 561 ret <vscale x 1 x i16> %v 562} 563 564define <vscale x 1 x i16> @vpmerge_vi_nxv1i16(<vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 565; CHECK-LABEL: vpmerge_vi_nxv1i16: 566; CHECK: # %bb.0: 567; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, mu 568; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 569; CHECK-NEXT: ret 570 %elt.head = insertelement <vscale x 1 x i16> poison, i16 2, i32 0 571 %va = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 572 %v = call <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1> %m, <vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, i32 %evl) 573 ret <vscale x 1 x i16> %v 574} 575 576declare <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1>, <vscale x 2 x i16>, <vscale x 2 x i16>, i32) 577 578define <vscale x 2 x i16> @vpmerge_vv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 579; CHECK-LABEL: vpmerge_vv_nxv2i16: 580; CHECK: # %bb.0: 581; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, mu 582; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 583; CHECK-NEXT: vmv1r.v v8, v9 584; CHECK-NEXT: ret 585 %v = call <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1> %m, <vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, i32 %evl) 586 ret <vscale x 2 x i16> %v 587} 588 589define <vscale x 2 x i16> @vpmerge_vx_nxv2i16(i16 %a, <vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 590; CHECK-LABEL: vpmerge_vx_nxv2i16: 591; CHECK: # %bb.0: 592; CHECK-NEXT: vsetvli zero, a1, e16, mf2, tu, mu 593; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 594; CHECK-NEXT: ret 595 %elt.head = insertelement <vscale x 2 x i16> poison, i16 %a, i32 0 596 %va = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 597 %v = call <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1> %m, <vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, i32 %evl) 598 ret <vscale x 2 x i16> %v 599} 600 601define <vscale x 2 x i16> @vpmerge_vi_nxv2i16(<vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 602; CHECK-LABEL: vpmerge_vi_nxv2i16: 603; CHECK: # %bb.0: 604; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, mu 605; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 606; CHECK-NEXT: ret 607 %elt.head = insertelement <vscale x 2 x i16> poison, i16 2, i32 0 608 %va = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 609 %v = call <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1> %m, <vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, i32 %evl) 610 ret <vscale x 2 x i16> %v 611} 612 613declare <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1>, <vscale x 4 x i16>, <vscale x 4 x i16>, i32) 614 615define <vscale x 4 x i16> @vpmerge_vv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 616; CHECK-LABEL: vpmerge_vv_nxv4i16: 617; CHECK: # %bb.0: 618; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, mu 619; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 620; CHECK-NEXT: vmv1r.v v8, v9 621; CHECK-NEXT: ret 622 %v = call <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1> %m, <vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, i32 %evl) 623 ret <vscale x 4 x i16> %v 624} 625 626define <vscale x 4 x i16> @vpmerge_vx_nxv4i16(i16 %a, <vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 627; CHECK-LABEL: vpmerge_vx_nxv4i16: 628; CHECK: # %bb.0: 629; CHECK-NEXT: vsetvli zero, a1, e16, m1, tu, mu 630; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 631; CHECK-NEXT: ret 632 %elt.head = insertelement <vscale x 4 x i16> poison, i16 %a, i32 0 633 %va = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 634 %v = call <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1> %m, <vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, i32 %evl) 635 ret <vscale x 4 x i16> %v 636} 637 638define <vscale x 4 x i16> @vpmerge_vi_nxv4i16(<vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 639; CHECK-LABEL: vpmerge_vi_nxv4i16: 640; CHECK: # %bb.0: 641; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, mu 642; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 643; CHECK-NEXT: ret 644 %elt.head = insertelement <vscale x 4 x i16> poison, i16 2, i32 0 645 %va = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 646 %v = call <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1> %m, <vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, i32 %evl) 647 ret <vscale x 4 x i16> %v 648} 649 650declare <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32) 651 652define <vscale x 8 x i16> @vpmerge_vv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 653; CHECK-LABEL: vpmerge_vv_nxv8i16: 654; CHECK: # %bb.0: 655; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, mu 656; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0 657; CHECK-NEXT: vmv2r.v v8, v10 658; CHECK-NEXT: ret 659 %v = call <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1> %m, <vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, i32 %evl) 660 ret <vscale x 8 x i16> %v 661} 662 663define <vscale x 8 x i16> @vpmerge_vx_nxv8i16(i16 %a, <vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 664; CHECK-LABEL: vpmerge_vx_nxv8i16: 665; CHECK: # %bb.0: 666; CHECK-NEXT: vsetvli zero, a1, e16, m2, tu, mu 667; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 668; CHECK-NEXT: ret 669 %elt.head = insertelement <vscale x 8 x i16> poison, i16 %a, i32 0 670 %va = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 671 %v = call <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1> %m, <vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, i32 %evl) 672 ret <vscale x 8 x i16> %v 673} 674 675define <vscale x 8 x i16> @vpmerge_vi_nxv8i16(<vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 676; CHECK-LABEL: vpmerge_vi_nxv8i16: 677; CHECK: # %bb.0: 678; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, mu 679; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 680; CHECK-NEXT: ret 681 %elt.head = insertelement <vscale x 8 x i16> poison, i16 2, i32 0 682 %va = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 683 %v = call <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1> %m, <vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, i32 %evl) 684 ret <vscale x 8 x i16> %v 685} 686 687declare <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1>, <vscale x 16 x i16>, <vscale x 16 x i16>, i32) 688 689define <vscale x 16 x i16> @vpmerge_vv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 690; CHECK-LABEL: vpmerge_vv_nxv16i16: 691; CHECK: # %bb.0: 692; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, mu 693; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0 694; CHECK-NEXT: vmv4r.v v8, v12 695; CHECK-NEXT: ret 696 %v = call <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1> %m, <vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, i32 %evl) 697 ret <vscale x 16 x i16> %v 698} 699 700define <vscale x 16 x i16> @vpmerge_vx_nxv16i16(i16 %a, <vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 701; CHECK-LABEL: vpmerge_vx_nxv16i16: 702; CHECK: # %bb.0: 703; CHECK-NEXT: vsetvli zero, a1, e16, m4, tu, mu 704; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 705; CHECK-NEXT: ret 706 %elt.head = insertelement <vscale x 16 x i16> poison, i16 %a, i32 0 707 %va = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 708 %v = call <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1> %m, <vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, i32 %evl) 709 ret <vscale x 16 x i16> %v 710} 711 712define <vscale x 16 x i16> @vpmerge_vi_nxv16i16(<vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 713; CHECK-LABEL: vpmerge_vi_nxv16i16: 714; CHECK: # %bb.0: 715; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, mu 716; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 717; CHECK-NEXT: ret 718 %elt.head = insertelement <vscale x 16 x i16> poison, i16 2, i32 0 719 %va = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 720 %v = call <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1> %m, <vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, i32 %evl) 721 ret <vscale x 16 x i16> %v 722} 723 724declare <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1>, <vscale x 32 x i16>, <vscale x 32 x i16>, i32) 725 726define <vscale x 32 x i16> @vpmerge_vv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) { 727; CHECK-LABEL: vpmerge_vv_nxv32i16: 728; CHECK: # %bb.0: 729; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, mu 730; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0 731; CHECK-NEXT: vmv8r.v v8, v16 732; CHECK-NEXT: ret 733 %v = call <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1> %m, <vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, i32 %evl) 734 ret <vscale x 32 x i16> %v 735} 736 737define <vscale x 32 x i16> @vpmerge_vx_nxv32i16(i16 %a, <vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) { 738; CHECK-LABEL: vpmerge_vx_nxv32i16: 739; CHECK: # %bb.0: 740; CHECK-NEXT: vsetvli zero, a1, e16, m8, tu, mu 741; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 742; CHECK-NEXT: ret 743 %elt.head = insertelement <vscale x 32 x i16> poison, i16 %a, i32 0 744 %va = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 745 %v = call <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1> %m, <vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, i32 %evl) 746 ret <vscale x 32 x i16> %v 747} 748 749define <vscale x 32 x i16> @vpmerge_vi_nxv32i16(<vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) { 750; CHECK-LABEL: vpmerge_vi_nxv32i16: 751; CHECK: # %bb.0: 752; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, mu 753; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 754; CHECK-NEXT: ret 755 %elt.head = insertelement <vscale x 32 x i16> poison, i16 2, i32 0 756 %va = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 757 %v = call <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1> %m, <vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, i32 %evl) 758 ret <vscale x 32 x i16> %v 759} 760 761declare <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1>, <vscale x 1 x i32>, <vscale x 1 x i32>, i32) 762 763define <vscale x 1 x i32> @vpmerge_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 764; CHECK-LABEL: vpmerge_vv_nxv1i32: 765; CHECK: # %bb.0: 766; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, mu 767; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 768; CHECK-NEXT: vmv1r.v v8, v9 769; CHECK-NEXT: ret 770 %v = call <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1> %m, <vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, i32 %evl) 771 ret <vscale x 1 x i32> %v 772} 773 774define <vscale x 1 x i32> @vpmerge_vx_nxv1i32(i32 %a, <vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 775; CHECK-LABEL: vpmerge_vx_nxv1i32: 776; CHECK: # %bb.0: 777; CHECK-NEXT: vsetvli zero, a1, e32, mf2, tu, mu 778; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 779; CHECK-NEXT: ret 780 %elt.head = insertelement <vscale x 1 x i32> poison, i32 %a, i32 0 781 %va = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 782 %v = call <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1> %m, <vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, i32 %evl) 783 ret <vscale x 1 x i32> %v 784} 785 786define <vscale x 1 x i32> @vpmerge_vi_nxv1i32(<vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 787; CHECK-LABEL: vpmerge_vi_nxv1i32: 788; CHECK: # %bb.0: 789; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, mu 790; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 791; CHECK-NEXT: ret 792 %elt.head = insertelement <vscale x 1 x i32> poison, i32 2, i32 0 793 %va = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 794 %v = call <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1> %m, <vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, i32 %evl) 795 ret <vscale x 1 x i32> %v 796} 797 798declare <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1>, <vscale x 2 x i32>, <vscale x 2 x i32>, i32) 799 800define <vscale x 2 x i32> @vpmerge_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 801; CHECK-LABEL: vpmerge_vv_nxv2i32: 802; CHECK: # %bb.0: 803; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu 804; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 805; CHECK-NEXT: vmv1r.v v8, v9 806; CHECK-NEXT: ret 807 %v = call <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1> %m, <vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, i32 %evl) 808 ret <vscale x 2 x i32> %v 809} 810 811define <vscale x 2 x i32> @vpmerge_vx_nxv2i32(i32 %a, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 812; CHECK-LABEL: vpmerge_vx_nxv2i32: 813; CHECK: # %bb.0: 814; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, mu 815; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 816; CHECK-NEXT: ret 817 %elt.head = insertelement <vscale x 2 x i32> poison, i32 %a, i32 0 818 %va = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 819 %v = call <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1> %m, <vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, i32 %evl) 820 ret <vscale x 2 x i32> %v 821} 822 823define <vscale x 2 x i32> @vpmerge_vi_nxv2i32(<vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 824; CHECK-LABEL: vpmerge_vi_nxv2i32: 825; CHECK: # %bb.0: 826; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu 827; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 828; CHECK-NEXT: ret 829 %elt.head = insertelement <vscale x 2 x i32> poison, i32 2, i32 0 830 %va = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 831 %v = call <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1> %m, <vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, i32 %evl) 832 ret <vscale x 2 x i32> %v 833} 834 835declare <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>, i32) 836 837define <vscale x 4 x i32> @vpmerge_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 838; CHECK-LABEL: vpmerge_vv_nxv4i32: 839; CHECK: # %bb.0: 840; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu 841; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0 842; CHECK-NEXT: vmv2r.v v8, v10 843; CHECK-NEXT: ret 844 %v = call <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1> %m, <vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, i32 %evl) 845 ret <vscale x 4 x i32> %v 846} 847 848define <vscale x 4 x i32> @vpmerge_vx_nxv4i32(i32 %a, <vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 849; CHECK-LABEL: vpmerge_vx_nxv4i32: 850; CHECK: # %bb.0: 851; CHECK-NEXT: vsetvli zero, a1, e32, m2, tu, mu 852; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 853; CHECK-NEXT: ret 854 %elt.head = insertelement <vscale x 4 x i32> poison, i32 %a, i32 0 855 %va = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 856 %v = call <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1> %m, <vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, i32 %evl) 857 ret <vscale x 4 x i32> %v 858} 859 860define <vscale x 4 x i32> @vpmerge_vi_nxv4i32(<vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 861; CHECK-LABEL: vpmerge_vi_nxv4i32: 862; CHECK: # %bb.0: 863; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu 864; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 865; CHECK-NEXT: ret 866 %elt.head = insertelement <vscale x 4 x i32> poison, i32 2, i32 0 867 %va = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 868 %v = call <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1> %m, <vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, i32 %evl) 869 ret <vscale x 4 x i32> %v 870} 871 872declare <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1>, <vscale x 8 x i32>, <vscale x 8 x i32>, i32) 873 874define <vscale x 8 x i32> @vpmerge_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 875; CHECK-LABEL: vpmerge_vv_nxv8i32: 876; CHECK: # %bb.0: 877; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, mu 878; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0 879; CHECK-NEXT: vmv4r.v v8, v12 880; CHECK-NEXT: ret 881 %v = call <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1> %m, <vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, i32 %evl) 882 ret <vscale x 8 x i32> %v 883} 884 885define <vscale x 8 x i32> @vpmerge_vx_nxv8i32(i32 %a, <vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 886; CHECK-LABEL: vpmerge_vx_nxv8i32: 887; CHECK: # %bb.0: 888; CHECK-NEXT: vsetvli zero, a1, e32, m4, tu, mu 889; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 890; CHECK-NEXT: ret 891 %elt.head = insertelement <vscale x 8 x i32> poison, i32 %a, i32 0 892 %va = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 893 %v = call <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1> %m, <vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, i32 %evl) 894 ret <vscale x 8 x i32> %v 895} 896 897define <vscale x 8 x i32> @vpmerge_vi_nxv8i32(<vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 898; CHECK-LABEL: vpmerge_vi_nxv8i32: 899; CHECK: # %bb.0: 900; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, mu 901; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 902; CHECK-NEXT: ret 903 %elt.head = insertelement <vscale x 8 x i32> poison, i32 2, i32 0 904 %va = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 905 %v = call <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1> %m, <vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, i32 %evl) 906 ret <vscale x 8 x i32> %v 907} 908 909declare <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1>, <vscale x 16 x i32>, <vscale x 16 x i32>, i32) 910 911define <vscale x 16 x i32> @vpmerge_vv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 912; CHECK-LABEL: vpmerge_vv_nxv16i32: 913; CHECK: # %bb.0: 914; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, mu 915; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0 916; CHECK-NEXT: vmv8r.v v8, v16 917; CHECK-NEXT: ret 918 %v = call <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1> %m, <vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, i32 %evl) 919 ret <vscale x 16 x i32> %v 920} 921 922define <vscale x 16 x i32> @vpmerge_vx_nxv16i32(i32 %a, <vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 923; CHECK-LABEL: vpmerge_vx_nxv16i32: 924; CHECK: # %bb.0: 925; CHECK-NEXT: vsetvli zero, a1, e32, m8, tu, mu 926; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 927; CHECK-NEXT: ret 928 %elt.head = insertelement <vscale x 16 x i32> poison, i32 %a, i32 0 929 %va = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 930 %v = call <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1> %m, <vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, i32 %evl) 931 ret <vscale x 16 x i32> %v 932} 933 934define <vscale x 16 x i32> @vpmerge_vi_nxv16i32(<vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 935; CHECK-LABEL: vpmerge_vi_nxv16i32: 936; CHECK: # %bb.0: 937; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, mu 938; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 939; CHECK-NEXT: ret 940 %elt.head = insertelement <vscale x 16 x i32> poison, i32 2, i32 0 941 %va = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 942 %v = call <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1> %m, <vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, i32 %evl) 943 ret <vscale x 16 x i32> %v 944} 945 946declare <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1>, <vscale x 1 x i64>, <vscale x 1 x i64>, i32) 947 948define <vscale x 1 x i64> @vpmerge_vv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 949; CHECK-LABEL: vpmerge_vv_nxv1i64: 950; CHECK: # %bb.0: 951; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, mu 952; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 953; CHECK-NEXT: vmv1r.v v8, v9 954; CHECK-NEXT: ret 955 %v = call <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1> %m, <vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, i32 %evl) 956 ret <vscale x 1 x i64> %v 957} 958 959define <vscale x 1 x i64> @vpmerge_vx_nxv1i64(i64 %a, <vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 960; RV32-LABEL: vpmerge_vx_nxv1i64: 961; RV32: # %bb.0: 962; RV32-NEXT: addi sp, sp, -16 963; RV32-NEXT: .cfi_def_cfa_offset 16 964; RV32-NEXT: sw a1, 12(sp) 965; RV32-NEXT: sw a0, 8(sp) 966; RV32-NEXT: addi a0, sp, 8 967; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, mu 968; RV32-NEXT: vlse64.v v9, (a0), zero 969; RV32-NEXT: vsetvli zero, a2, e64, m1, tu, mu 970; RV32-NEXT: vmerge.vvm v8, v8, v9, v0 971; RV32-NEXT: addi sp, sp, 16 972; RV32-NEXT: ret 973; 974; RV64-LABEL: vpmerge_vx_nxv1i64: 975; RV64: # %bb.0: 976; RV64-NEXT: vsetvli zero, a1, e64, m1, tu, mu 977; RV64-NEXT: vmerge.vxm v8, v8, a0, v0 978; RV64-NEXT: ret 979 %elt.head = insertelement <vscale x 1 x i64> poison, i64 %a, i32 0 980 %va = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 981 %v = call <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1> %m, <vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, i32 %evl) 982 ret <vscale x 1 x i64> %v 983} 984 985define <vscale x 1 x i64> @vpmerge_vi_nxv1i64(<vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 986; CHECK-LABEL: vpmerge_vi_nxv1i64: 987; CHECK: # %bb.0: 988; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, mu 989; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 990; CHECK-NEXT: ret 991 %elt.head = insertelement <vscale x 1 x i64> poison, i64 2, i32 0 992 %va = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 993 %v = call <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1> %m, <vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, i32 %evl) 994 ret <vscale x 1 x i64> %v 995} 996 997declare <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>, i32) 998 999define <vscale x 2 x i64> @vpmerge_vv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1000; CHECK-LABEL: vpmerge_vv_nxv2i64: 1001; CHECK: # %bb.0: 1002; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, mu 1003; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0 1004; CHECK-NEXT: vmv2r.v v8, v10 1005; CHECK-NEXT: ret 1006 %v = call <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1> %m, <vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, i32 %evl) 1007 ret <vscale x 2 x i64> %v 1008} 1009 1010define <vscale x 2 x i64> @vpmerge_vx_nxv2i64(i64 %a, <vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1011; RV32-LABEL: vpmerge_vx_nxv2i64: 1012; RV32: # %bb.0: 1013; RV32-NEXT: addi sp, sp, -16 1014; RV32-NEXT: .cfi_def_cfa_offset 16 1015; RV32-NEXT: sw a1, 12(sp) 1016; RV32-NEXT: sw a0, 8(sp) 1017; RV32-NEXT: addi a0, sp, 8 1018; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, mu 1019; RV32-NEXT: vlse64.v v10, (a0), zero 1020; RV32-NEXT: vsetvli zero, a2, e64, m2, tu, mu 1021; RV32-NEXT: vmerge.vvm v8, v8, v10, v0 1022; RV32-NEXT: addi sp, sp, 16 1023; RV32-NEXT: ret 1024; 1025; RV64-LABEL: vpmerge_vx_nxv2i64: 1026; RV64: # %bb.0: 1027; RV64-NEXT: vsetvli zero, a1, e64, m2, tu, mu 1028; RV64-NEXT: vmerge.vxm v8, v8, a0, v0 1029; RV64-NEXT: ret 1030 %elt.head = insertelement <vscale x 2 x i64> poison, i64 %a, i32 0 1031 %va = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 1032 %v = call <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1> %m, <vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, i32 %evl) 1033 ret <vscale x 2 x i64> %v 1034} 1035 1036define <vscale x 2 x i64> @vpmerge_vi_nxv2i64(<vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1037; CHECK-LABEL: vpmerge_vi_nxv2i64: 1038; CHECK: # %bb.0: 1039; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, mu 1040; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 1041; CHECK-NEXT: ret 1042 %elt.head = insertelement <vscale x 2 x i64> poison, i64 2, i32 0 1043 %va = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 1044 %v = call <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1> %m, <vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, i32 %evl) 1045 ret <vscale x 2 x i64> %v 1046} 1047 1048declare <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1>, <vscale x 4 x i64>, <vscale x 4 x i64>, i32) 1049 1050define <vscale x 4 x i64> @vpmerge_vv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1051; CHECK-LABEL: vpmerge_vv_nxv4i64: 1052; CHECK: # %bb.0: 1053; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, mu 1054; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0 1055; CHECK-NEXT: vmv4r.v v8, v12 1056; CHECK-NEXT: ret 1057 %v = call <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1> %m, <vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, i32 %evl) 1058 ret <vscale x 4 x i64> %v 1059} 1060 1061define <vscale x 4 x i64> @vpmerge_vx_nxv4i64(i64 %a, <vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1062; RV32-LABEL: vpmerge_vx_nxv4i64: 1063; RV32: # %bb.0: 1064; RV32-NEXT: addi sp, sp, -16 1065; RV32-NEXT: .cfi_def_cfa_offset 16 1066; RV32-NEXT: sw a1, 12(sp) 1067; RV32-NEXT: sw a0, 8(sp) 1068; RV32-NEXT: addi a0, sp, 8 1069; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, mu 1070; RV32-NEXT: vlse64.v v12, (a0), zero 1071; RV32-NEXT: vsetvli zero, a2, e64, m4, tu, mu 1072; RV32-NEXT: vmerge.vvm v8, v8, v12, v0 1073; RV32-NEXT: addi sp, sp, 16 1074; RV32-NEXT: ret 1075; 1076; RV64-LABEL: vpmerge_vx_nxv4i64: 1077; RV64: # %bb.0: 1078; RV64-NEXT: vsetvli zero, a1, e64, m4, tu, mu 1079; RV64-NEXT: vmerge.vxm v8, v8, a0, v0 1080; RV64-NEXT: ret 1081 %elt.head = insertelement <vscale x 4 x i64> poison, i64 %a, i32 0 1082 %va = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 1083 %v = call <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1> %m, <vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, i32 %evl) 1084 ret <vscale x 4 x i64> %v 1085} 1086 1087define <vscale x 4 x i64> @vpmerge_vi_nxv4i64(<vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1088; CHECK-LABEL: vpmerge_vi_nxv4i64: 1089; CHECK: # %bb.0: 1090; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, mu 1091; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 1092; CHECK-NEXT: ret 1093 %elt.head = insertelement <vscale x 4 x i64> poison, i64 2, i32 0 1094 %va = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 1095 %v = call <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1> %m, <vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, i32 %evl) 1096 ret <vscale x 4 x i64> %v 1097} 1098 1099declare <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1>, <vscale x 8 x i64>, <vscale x 8 x i64>, i32) 1100 1101define <vscale x 8 x i64> @vpmerge_vv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1102; CHECK-LABEL: vpmerge_vv_nxv8i64: 1103; CHECK: # %bb.0: 1104; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, mu 1105; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0 1106; CHECK-NEXT: vmv8r.v v8, v16 1107; CHECK-NEXT: ret 1108 %v = call <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1> %m, <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, i32 %evl) 1109 ret <vscale x 8 x i64> %v 1110} 1111 1112define <vscale x 8 x i64> @vpmerge_vx_nxv8i64(i64 %a, <vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1113; RV32-LABEL: vpmerge_vx_nxv8i64: 1114; RV32: # %bb.0: 1115; RV32-NEXT: addi sp, sp, -16 1116; RV32-NEXT: .cfi_def_cfa_offset 16 1117; RV32-NEXT: sw a1, 12(sp) 1118; RV32-NEXT: sw a0, 8(sp) 1119; RV32-NEXT: addi a0, sp, 8 1120; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, mu 1121; RV32-NEXT: vlse64.v v16, (a0), zero 1122; RV32-NEXT: vsetvli zero, a2, e64, m8, tu, mu 1123; RV32-NEXT: vmerge.vvm v8, v8, v16, v0 1124; RV32-NEXT: addi sp, sp, 16 1125; RV32-NEXT: ret 1126; 1127; RV64-LABEL: vpmerge_vx_nxv8i64: 1128; RV64: # %bb.0: 1129; RV64-NEXT: vsetvli zero, a1, e64, m8, tu, mu 1130; RV64-NEXT: vmerge.vxm v8, v8, a0, v0 1131; RV64-NEXT: ret 1132 %elt.head = insertelement <vscale x 8 x i64> poison, i64 %a, i32 0 1133 %va = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 1134 %v = call <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1> %m, <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, i32 %evl) 1135 ret <vscale x 8 x i64> %v 1136} 1137 1138define <vscale x 8 x i64> @vpmerge_vi_nxv8i64(<vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1139; CHECK-LABEL: vpmerge_vi_nxv8i64: 1140; CHECK: # %bb.0: 1141; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, mu 1142; CHECK-NEXT: vmerge.vim v8, v8, 2, v0 1143; CHECK-NEXT: ret 1144 %elt.head = insertelement <vscale x 8 x i64> poison, i64 2, i32 0 1145 %va = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 1146 %v = call <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1> %m, <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, i32 %evl) 1147 ret <vscale x 8 x i64> %v 1148} 1149 1150declare <vscale x 1 x half> @llvm.vp.merge.nxv1f16(<vscale x 1 x i1>, <vscale x 1 x half>, <vscale x 1 x half>, i32) 1151 1152define <vscale x 1 x half> @vpmerge_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1153; CHECK-LABEL: vpmerge_vv_nxv1f16: 1154; CHECK: # %bb.0: 1155; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, mu 1156; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 1157; CHECK-NEXT: vmv1r.v v8, v9 1158; CHECK-NEXT: ret 1159 %v = call <vscale x 1 x half> @llvm.vp.merge.nxv1f16(<vscale x 1 x i1> %m, <vscale x 1 x half> %va, <vscale x 1 x half> %vb, i32 %evl) 1160 ret <vscale x 1 x half> %v 1161} 1162 1163define <vscale x 1 x half> @vpmerge_vf_nxv1f16(half %a, <vscale x 1 x half> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1164; CHECK-LABEL: vpmerge_vf_nxv1f16: 1165; CHECK: # %bb.0: 1166; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, mu 1167; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1168; CHECK-NEXT: ret 1169 %elt.head = insertelement <vscale x 1 x half> poison, half %a, i32 0 1170 %va = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 1171 %v = call <vscale x 1 x half> @llvm.vp.merge.nxv1f16(<vscale x 1 x i1> %m, <vscale x 1 x half> %va, <vscale x 1 x half> %vb, i32 %evl) 1172 ret <vscale x 1 x half> %v 1173} 1174 1175declare <vscale x 2 x half> @llvm.vp.merge.nxv2f16(<vscale x 2 x i1>, <vscale x 2 x half>, <vscale x 2 x half>, i32) 1176 1177define <vscale x 2 x half> @vpmerge_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1178; CHECK-LABEL: vpmerge_vv_nxv2f16: 1179; CHECK: # %bb.0: 1180; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, mu 1181; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 1182; CHECK-NEXT: vmv1r.v v8, v9 1183; CHECK-NEXT: ret 1184 %v = call <vscale x 2 x half> @llvm.vp.merge.nxv2f16(<vscale x 2 x i1> %m, <vscale x 2 x half> %va, <vscale x 2 x half> %vb, i32 %evl) 1185 ret <vscale x 2 x half> %v 1186} 1187 1188define <vscale x 2 x half> @vpmerge_vf_nxv2f16(half %a, <vscale x 2 x half> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1189; CHECK-LABEL: vpmerge_vf_nxv2f16: 1190; CHECK: # %bb.0: 1191; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, mu 1192; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1193; CHECK-NEXT: ret 1194 %elt.head = insertelement <vscale x 2 x half> poison, half %a, i32 0 1195 %va = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 1196 %v = call <vscale x 2 x half> @llvm.vp.merge.nxv2f16(<vscale x 2 x i1> %m, <vscale x 2 x half> %va, <vscale x 2 x half> %vb, i32 %evl) 1197 ret <vscale x 2 x half> %v 1198} 1199 1200declare <vscale x 4 x half> @llvm.vp.merge.nxv4f16(<vscale x 4 x i1>, <vscale x 4 x half>, <vscale x 4 x half>, i32) 1201 1202define <vscale x 4 x half> @vpmerge_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1203; CHECK-LABEL: vpmerge_vv_nxv4f16: 1204; CHECK: # %bb.0: 1205; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, mu 1206; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 1207; CHECK-NEXT: vmv1r.v v8, v9 1208; CHECK-NEXT: ret 1209 %v = call <vscale x 4 x half> @llvm.vp.merge.nxv4f16(<vscale x 4 x i1> %m, <vscale x 4 x half> %va, <vscale x 4 x half> %vb, i32 %evl) 1210 ret <vscale x 4 x half> %v 1211} 1212 1213define <vscale x 4 x half> @vpmerge_vf_nxv4f16(half %a, <vscale x 4 x half> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1214; CHECK-LABEL: vpmerge_vf_nxv4f16: 1215; CHECK: # %bb.0: 1216; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, mu 1217; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1218; CHECK-NEXT: ret 1219 %elt.head = insertelement <vscale x 4 x half> poison, half %a, i32 0 1220 %va = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 1221 %v = call <vscale x 4 x half> @llvm.vp.merge.nxv4f16(<vscale x 4 x i1> %m, <vscale x 4 x half> %va, <vscale x 4 x half> %vb, i32 %evl) 1222 ret <vscale x 4 x half> %v 1223} 1224 1225declare <vscale x 8 x half> @llvm.vp.merge.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>, <vscale x 8 x half>, i32) 1226 1227define <vscale x 8 x half> @vpmerge_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1228; CHECK-LABEL: vpmerge_vv_nxv8f16: 1229; CHECK: # %bb.0: 1230; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, mu 1231; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0 1232; CHECK-NEXT: vmv2r.v v8, v10 1233; CHECK-NEXT: ret 1234 %v = call <vscale x 8 x half> @llvm.vp.merge.nxv8f16(<vscale x 8 x i1> %m, <vscale x 8 x half> %va, <vscale x 8 x half> %vb, i32 %evl) 1235 ret <vscale x 8 x half> %v 1236} 1237 1238define <vscale x 8 x half> @vpmerge_vf_nxv8f16(half %a, <vscale x 8 x half> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1239; CHECK-LABEL: vpmerge_vf_nxv8f16: 1240; CHECK: # %bb.0: 1241; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, mu 1242; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1243; CHECK-NEXT: ret 1244 %elt.head = insertelement <vscale x 8 x half> poison, half %a, i32 0 1245 %va = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 1246 %v = call <vscale x 8 x half> @llvm.vp.merge.nxv8f16(<vscale x 8 x i1> %m, <vscale x 8 x half> %va, <vscale x 8 x half> %vb, i32 %evl) 1247 ret <vscale x 8 x half> %v 1248} 1249 1250declare <vscale x 16 x half> @llvm.vp.merge.nxv16f16(<vscale x 16 x i1>, <vscale x 16 x half>, <vscale x 16 x half>, i32) 1251 1252define <vscale x 16 x half> @vpmerge_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 1253; CHECK-LABEL: vpmerge_vv_nxv16f16: 1254; CHECK: # %bb.0: 1255; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, mu 1256; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0 1257; CHECK-NEXT: vmv4r.v v8, v12 1258; CHECK-NEXT: ret 1259 %v = call <vscale x 16 x half> @llvm.vp.merge.nxv16f16(<vscale x 16 x i1> %m, <vscale x 16 x half> %va, <vscale x 16 x half> %vb, i32 %evl) 1260 ret <vscale x 16 x half> %v 1261} 1262 1263define <vscale x 16 x half> @vpmerge_vf_nxv16f16(half %a, <vscale x 16 x half> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 1264; CHECK-LABEL: vpmerge_vf_nxv16f16: 1265; CHECK: # %bb.0: 1266; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, mu 1267; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1268; CHECK-NEXT: ret 1269 %elt.head = insertelement <vscale x 16 x half> poison, half %a, i32 0 1270 %va = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 1271 %v = call <vscale x 16 x half> @llvm.vp.merge.nxv16f16(<vscale x 16 x i1> %m, <vscale x 16 x half> %va, <vscale x 16 x half> %vb, i32 %evl) 1272 ret <vscale x 16 x half> %v 1273} 1274 1275declare <vscale x 32 x half> @llvm.vp.merge.nxv32f16(<vscale x 32 x i1>, <vscale x 32 x half>, <vscale x 32 x half>, i32) 1276 1277define <vscale x 32 x half> @vpmerge_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) { 1278; CHECK-LABEL: vpmerge_vv_nxv32f16: 1279; CHECK: # %bb.0: 1280; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, mu 1281; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0 1282; CHECK-NEXT: vmv8r.v v8, v16 1283; CHECK-NEXT: ret 1284 %v = call <vscale x 32 x half> @llvm.vp.merge.nxv32f16(<vscale x 32 x i1> %m, <vscale x 32 x half> %va, <vscale x 32 x half> %vb, i32 %evl) 1285 ret <vscale x 32 x half> %v 1286} 1287 1288define <vscale x 32 x half> @vpmerge_vf_nxv32f16(half %a, <vscale x 32 x half> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) { 1289; CHECK-LABEL: vpmerge_vf_nxv32f16: 1290; CHECK: # %bb.0: 1291; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, mu 1292; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1293; CHECK-NEXT: ret 1294 %elt.head = insertelement <vscale x 32 x half> poison, half %a, i32 0 1295 %va = shufflevector <vscale x 32 x half> %elt.head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer 1296 %v = call <vscale x 32 x half> @llvm.vp.merge.nxv32f16(<vscale x 32 x i1> %m, <vscale x 32 x half> %va, <vscale x 32 x half> %vb, i32 %evl) 1297 ret <vscale x 32 x half> %v 1298} 1299 1300declare <vscale x 1 x float> @llvm.vp.merge.nxv1f32(<vscale x 1 x i1>, <vscale x 1 x float>, <vscale x 1 x float>, i32) 1301 1302define <vscale x 1 x float> @vpmerge_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1303; CHECK-LABEL: vpmerge_vv_nxv1f32: 1304; CHECK: # %bb.0: 1305; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, mu 1306; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 1307; CHECK-NEXT: vmv1r.v v8, v9 1308; CHECK-NEXT: ret 1309 %v = call <vscale x 1 x float> @llvm.vp.merge.nxv1f32(<vscale x 1 x i1> %m, <vscale x 1 x float> %va, <vscale x 1 x float> %vb, i32 %evl) 1310 ret <vscale x 1 x float> %v 1311} 1312 1313define <vscale x 1 x float> @vpmerge_vf_nxv1f32(float %a, <vscale x 1 x float> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1314; CHECK-LABEL: vpmerge_vf_nxv1f32: 1315; CHECK: # %bb.0: 1316; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, mu 1317; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1318; CHECK-NEXT: ret 1319 %elt.head = insertelement <vscale x 1 x float> poison, float %a, i32 0 1320 %va = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 1321 %v = call <vscale x 1 x float> @llvm.vp.merge.nxv1f32(<vscale x 1 x i1> %m, <vscale x 1 x float> %va, <vscale x 1 x float> %vb, i32 %evl) 1322 ret <vscale x 1 x float> %v 1323} 1324 1325declare <vscale x 2 x float> @llvm.vp.merge.nxv2f32(<vscale x 2 x i1>, <vscale x 2 x float>, <vscale x 2 x float>, i32) 1326 1327define <vscale x 2 x float> @vpmerge_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1328; CHECK-LABEL: vpmerge_vv_nxv2f32: 1329; CHECK: # %bb.0: 1330; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu 1331; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 1332; CHECK-NEXT: vmv1r.v v8, v9 1333; CHECK-NEXT: ret 1334 %v = call <vscale x 2 x float> @llvm.vp.merge.nxv2f32(<vscale x 2 x i1> %m, <vscale x 2 x float> %va, <vscale x 2 x float> %vb, i32 %evl) 1335 ret <vscale x 2 x float> %v 1336} 1337 1338define <vscale x 2 x float> @vpmerge_vf_nxv2f32(float %a, <vscale x 2 x float> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1339; CHECK-LABEL: vpmerge_vf_nxv2f32: 1340; CHECK: # %bb.0: 1341; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu 1342; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1343; CHECK-NEXT: ret 1344 %elt.head = insertelement <vscale x 2 x float> poison, float %a, i32 0 1345 %va = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 1346 %v = call <vscale x 2 x float> @llvm.vp.merge.nxv2f32(<vscale x 2 x i1> %m, <vscale x 2 x float> %va, <vscale x 2 x float> %vb, i32 %evl) 1347 ret <vscale x 2 x float> %v 1348} 1349 1350declare <vscale x 4 x float> @llvm.vp.merge.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>, <vscale x 4 x float>, i32) 1351 1352define <vscale x 4 x float> @vpmerge_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1353; CHECK-LABEL: vpmerge_vv_nxv4f32: 1354; CHECK: # %bb.0: 1355; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu 1356; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0 1357; CHECK-NEXT: vmv2r.v v8, v10 1358; CHECK-NEXT: ret 1359 %v = call <vscale x 4 x float> @llvm.vp.merge.nxv4f32(<vscale x 4 x i1> %m, <vscale x 4 x float> %va, <vscale x 4 x float> %vb, i32 %evl) 1360 ret <vscale x 4 x float> %v 1361} 1362 1363define <vscale x 4 x float> @vpmerge_vf_nxv4f32(float %a, <vscale x 4 x float> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1364; CHECK-LABEL: vpmerge_vf_nxv4f32: 1365; CHECK: # %bb.0: 1366; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, mu 1367; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1368; CHECK-NEXT: ret 1369 %elt.head = insertelement <vscale x 4 x float> poison, float %a, i32 0 1370 %va = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 1371 %v = call <vscale x 4 x float> @llvm.vp.merge.nxv4f32(<vscale x 4 x i1> %m, <vscale x 4 x float> %va, <vscale x 4 x float> %vb, i32 %evl) 1372 ret <vscale x 4 x float> %v 1373} 1374 1375declare <vscale x 8 x float> @llvm.vp.merge.nxv8f32(<vscale x 8 x i1>, <vscale x 8 x float>, <vscale x 8 x float>, i32) 1376 1377define <vscale x 8 x float> @vpmerge_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1378; CHECK-LABEL: vpmerge_vv_nxv8f32: 1379; CHECK: # %bb.0: 1380; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, mu 1381; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0 1382; CHECK-NEXT: vmv4r.v v8, v12 1383; CHECK-NEXT: ret 1384 %v = call <vscale x 8 x float> @llvm.vp.merge.nxv8f32(<vscale x 8 x i1> %m, <vscale x 8 x float> %va, <vscale x 8 x float> %vb, i32 %evl) 1385 ret <vscale x 8 x float> %v 1386} 1387 1388define <vscale x 8 x float> @vpmerge_vf_nxv8f32(float %a, <vscale x 8 x float> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1389; CHECK-LABEL: vpmerge_vf_nxv8f32: 1390; CHECK: # %bb.0: 1391; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, mu 1392; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1393; CHECK-NEXT: ret 1394 %elt.head = insertelement <vscale x 8 x float> poison, float %a, i32 0 1395 %va = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 1396 %v = call <vscale x 8 x float> @llvm.vp.merge.nxv8f32(<vscale x 8 x i1> %m, <vscale x 8 x float> %va, <vscale x 8 x float> %vb, i32 %evl) 1397 ret <vscale x 8 x float> %v 1398} 1399 1400declare <vscale x 16 x float> @llvm.vp.merge.nxv16f32(<vscale x 16 x i1>, <vscale x 16 x float>, <vscale x 16 x float>, i32) 1401 1402define <vscale x 16 x float> @vpmerge_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 1403; CHECK-LABEL: vpmerge_vv_nxv16f32: 1404; CHECK: # %bb.0: 1405; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, mu 1406; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0 1407; CHECK-NEXT: vmv8r.v v8, v16 1408; CHECK-NEXT: ret 1409 %v = call <vscale x 16 x float> @llvm.vp.merge.nxv16f32(<vscale x 16 x i1> %m, <vscale x 16 x float> %va, <vscale x 16 x float> %vb, i32 %evl) 1410 ret <vscale x 16 x float> %v 1411} 1412 1413define <vscale x 16 x float> @vpmerge_vf_nxv16f32(float %a, <vscale x 16 x float> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) { 1414; CHECK-LABEL: vpmerge_vf_nxv16f32: 1415; CHECK: # %bb.0: 1416; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, mu 1417; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1418; CHECK-NEXT: ret 1419 %elt.head = insertelement <vscale x 16 x float> poison, float %a, i32 0 1420 %va = shufflevector <vscale x 16 x float> %elt.head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer 1421 %v = call <vscale x 16 x float> @llvm.vp.merge.nxv16f32(<vscale x 16 x i1> %m, <vscale x 16 x float> %va, <vscale x 16 x float> %vb, i32 %evl) 1422 ret <vscale x 16 x float> %v 1423} 1424 1425declare <vscale x 1 x double> @llvm.vp.merge.nxv1f64(<vscale x 1 x i1>, <vscale x 1 x double>, <vscale x 1 x double>, i32) 1426 1427define <vscale x 1 x double> @vpmerge_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1428; CHECK-LABEL: vpmerge_vv_nxv1f64: 1429; CHECK: # %bb.0: 1430; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, mu 1431; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0 1432; CHECK-NEXT: vmv1r.v v8, v9 1433; CHECK-NEXT: ret 1434 %v = call <vscale x 1 x double> @llvm.vp.merge.nxv1f64(<vscale x 1 x i1> %m, <vscale x 1 x double> %va, <vscale x 1 x double> %vb, i32 %evl) 1435 ret <vscale x 1 x double> %v 1436} 1437 1438define <vscale x 1 x double> @vpmerge_vf_nxv1f64(double %a, <vscale x 1 x double> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1439; CHECK-LABEL: vpmerge_vf_nxv1f64: 1440; CHECK: # %bb.0: 1441; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, mu 1442; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1443; CHECK-NEXT: ret 1444 %elt.head = insertelement <vscale x 1 x double> poison, double %a, i32 0 1445 %va = shufflevector <vscale x 1 x double> %elt.head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 1446 %v = call <vscale x 1 x double> @llvm.vp.merge.nxv1f64(<vscale x 1 x i1> %m, <vscale x 1 x double> %va, <vscale x 1 x double> %vb, i32 %evl) 1447 ret <vscale x 1 x double> %v 1448} 1449 1450declare <vscale x 2 x double> @llvm.vp.merge.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>, <vscale x 2 x double>, i32) 1451 1452define <vscale x 2 x double> @vpmerge_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1453; CHECK-LABEL: vpmerge_vv_nxv2f64: 1454; CHECK: # %bb.0: 1455; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, mu 1456; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0 1457; CHECK-NEXT: vmv2r.v v8, v10 1458; CHECK-NEXT: ret 1459 %v = call <vscale x 2 x double> @llvm.vp.merge.nxv2f64(<vscale x 2 x i1> %m, <vscale x 2 x double> %va, <vscale x 2 x double> %vb, i32 %evl) 1460 ret <vscale x 2 x double> %v 1461} 1462 1463define <vscale x 2 x double> @vpmerge_vf_nxv2f64(double %a, <vscale x 2 x double> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1464; CHECK-LABEL: vpmerge_vf_nxv2f64: 1465; CHECK: # %bb.0: 1466; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, mu 1467; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1468; CHECK-NEXT: ret 1469 %elt.head = insertelement <vscale x 2 x double> poison, double %a, i32 0 1470 %va = shufflevector <vscale x 2 x double> %elt.head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer 1471 %v = call <vscale x 2 x double> @llvm.vp.merge.nxv2f64(<vscale x 2 x i1> %m, <vscale x 2 x double> %va, <vscale x 2 x double> %vb, i32 %evl) 1472 ret <vscale x 2 x double> %v 1473} 1474 1475declare <vscale x 4 x double> @llvm.vp.merge.nxv4f64(<vscale x 4 x i1>, <vscale x 4 x double>, <vscale x 4 x double>, i32) 1476 1477define <vscale x 4 x double> @vpmerge_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1478; CHECK-LABEL: vpmerge_vv_nxv4f64: 1479; CHECK: # %bb.0: 1480; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, mu 1481; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0 1482; CHECK-NEXT: vmv4r.v v8, v12 1483; CHECK-NEXT: ret 1484 %v = call <vscale x 4 x double> @llvm.vp.merge.nxv4f64(<vscale x 4 x i1> %m, <vscale x 4 x double> %va, <vscale x 4 x double> %vb, i32 %evl) 1485 ret <vscale x 4 x double> %v 1486} 1487 1488define <vscale x 4 x double> @vpmerge_vf_nxv4f64(double %a, <vscale x 4 x double> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1489; CHECK-LABEL: vpmerge_vf_nxv4f64: 1490; CHECK: # %bb.0: 1491; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, mu 1492; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1493; CHECK-NEXT: ret 1494 %elt.head = insertelement <vscale x 4 x double> poison, double %a, i32 0 1495 %va = shufflevector <vscale x 4 x double> %elt.head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer 1496 %v = call <vscale x 4 x double> @llvm.vp.merge.nxv4f64(<vscale x 4 x i1> %m, <vscale x 4 x double> %va, <vscale x 4 x double> %vb, i32 %evl) 1497 ret <vscale x 4 x double> %v 1498} 1499 1500declare <vscale x 8 x double> @llvm.vp.merge.nxv8f64(<vscale x 8 x i1>, <vscale x 8 x double>, <vscale x 8 x double>, i32) 1501 1502define <vscale x 8 x double> @vpmerge_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1503; CHECK-LABEL: vpmerge_vv_nxv8f64: 1504; CHECK: # %bb.0: 1505; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, mu 1506; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0 1507; CHECK-NEXT: vmv8r.v v8, v16 1508; CHECK-NEXT: ret 1509 %v = call <vscale x 8 x double> @llvm.vp.merge.nxv8f64(<vscale x 8 x i1> %m, <vscale x 8 x double> %va, <vscale x 8 x double> %vb, i32 %evl) 1510 ret <vscale x 8 x double> %v 1511} 1512 1513define <vscale x 8 x double> @vpmerge_vf_nxv8f64(double %a, <vscale x 8 x double> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1514; CHECK-LABEL: vpmerge_vf_nxv8f64: 1515; CHECK: # %bb.0: 1516; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, mu 1517; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0 1518; CHECK-NEXT: ret 1519 %elt.head = insertelement <vscale x 8 x double> poison, double %a, i32 0 1520 %va = shufflevector <vscale x 8 x double> %elt.head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 1521 %v = call <vscale x 8 x double> @llvm.vp.merge.nxv8f64(<vscale x 8 x i1> %m, <vscale x 8 x double> %va, <vscale x 8 x double> %vb, i32 %evl) 1522 ret <vscale x 8 x double> %v 1523} 1524