1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s --check-prefixes=CHECK,RV32 4; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s \ 5; RUN: | FileCheck %s --check-prefixes=CHECK,RV64 6 7define <vscale x 1 x i8> @vmerge_vv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, <vscale x 1 x i1> %cond) { 8; CHECK-LABEL: vmerge_vv_nxv1i8: 9; CHECK: # %bb.0: 10; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 11; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 12; CHECK-NEXT: ret 13 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i8> %va, <vscale x 1 x i8> %vb 14 ret <vscale x 1 x i8> %vc 15} 16 17define <vscale x 1 x i8> @vmerge_xv_nxv1i8(<vscale x 1 x i8> %va, i8 signext %b, <vscale x 1 x i1> %cond) { 18; CHECK-LABEL: vmerge_xv_nxv1i8: 19; CHECK: # %bb.0: 20; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 21; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 22; CHECK-NEXT: ret 23 %head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0 24 %splat = shufflevector <vscale x 1 x i8> %head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 25 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i8> %splat, <vscale x 1 x i8> %va 26 ret <vscale x 1 x i8> %vc 27} 28 29define <vscale x 1 x i8> @vmerge_iv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %cond) { 30; CHECK-LABEL: vmerge_iv_nxv1i8: 31; CHECK: # %bb.0: 32; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 33; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 34; CHECK-NEXT: ret 35 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i8> splat (i8 3), <vscale x 1 x i8> %va 36 ret <vscale x 1 x i8> %vc 37} 38 39define <vscale x 2 x i8> @vmerge_vv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, <vscale x 2 x i1> %cond) { 40; CHECK-LABEL: vmerge_vv_nxv2i8: 41; CHECK: # %bb.0: 42; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 43; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 44; CHECK-NEXT: ret 45 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i8> %va, <vscale x 2 x i8> %vb 46 ret <vscale x 2 x i8> %vc 47} 48 49define <vscale x 2 x i8> @vmerge_xv_nxv2i8(<vscale x 2 x i8> %va, i8 signext %b, <vscale x 2 x i1> %cond) { 50; CHECK-LABEL: vmerge_xv_nxv2i8: 51; CHECK: # %bb.0: 52; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 53; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 54; CHECK-NEXT: ret 55 %head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0 56 %splat = shufflevector <vscale x 2 x i8> %head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 57 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i8> %splat, <vscale x 2 x i8> %va 58 ret <vscale x 2 x i8> %vc 59} 60 61define <vscale x 2 x i8> @vmerge_iv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %cond) { 62; CHECK-LABEL: vmerge_iv_nxv2i8: 63; CHECK: # %bb.0: 64; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 65; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 66; CHECK-NEXT: ret 67 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i8> splat (i8 3), <vscale x 2 x i8> %va 68 ret <vscale x 2 x i8> %vc 69} 70 71define <vscale x 3 x i8> @vmerge_vv_nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, <vscale x 3 x i1> %cond) { 72; CHECK-LABEL: vmerge_vv_nxv3i8: 73; CHECK: # %bb.0: 74; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 75; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 76; CHECK-NEXT: ret 77 %vc = select <vscale x 3 x i1> %cond, <vscale x 3 x i8> %va, <vscale x 3 x i8> %vb 78 ret <vscale x 3 x i8> %vc 79} 80 81define <vscale x 3 x i8> @vmerge_xv_nxv3i8(<vscale x 3 x i8> %va, i8 signext %b, <vscale x 3 x i1> %cond) { 82; CHECK-LABEL: vmerge_xv_nxv3i8: 83; CHECK: # %bb.0: 84; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 85; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 86; CHECK-NEXT: ret 87 %head = insertelement <vscale x 3 x i8> poison, i8 %b, i32 0 88 %splat = shufflevector <vscale x 3 x i8> %head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer 89 %vc = select <vscale x 3 x i1> %cond, <vscale x 3 x i8> %splat, <vscale x 3 x i8> %va 90 ret <vscale x 3 x i8> %vc 91} 92 93define <vscale x 3 x i8> @vmerge_iv_nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i1> %cond) { 94; CHECK-LABEL: vmerge_iv_nxv3i8: 95; CHECK: # %bb.0: 96; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 97; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 98; CHECK-NEXT: ret 99 %vc = select <vscale x 3 x i1> %cond, <vscale x 3 x i8> splat (i8 3), <vscale x 3 x i8> %va 100 ret <vscale x 3 x i8> %vc 101} 102 103define <vscale x 4 x i8> @vmerge_vv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, <vscale x 4 x i1> %cond) { 104; CHECK-LABEL: vmerge_vv_nxv4i8: 105; CHECK: # %bb.0: 106; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 107; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 108; CHECK-NEXT: ret 109 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i8> %va, <vscale x 4 x i8> %vb 110 ret <vscale x 4 x i8> %vc 111} 112 113define <vscale x 4 x i8> @vmerge_xv_nxv4i8(<vscale x 4 x i8> %va, i8 signext %b, <vscale x 4 x i1> %cond) { 114; CHECK-LABEL: vmerge_xv_nxv4i8: 115; CHECK: # %bb.0: 116; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 117; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 118; CHECK-NEXT: ret 119 %head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0 120 %splat = shufflevector <vscale x 4 x i8> %head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 121 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i8> %splat, <vscale x 4 x i8> %va 122 ret <vscale x 4 x i8> %vc 123} 124 125define <vscale x 4 x i8> @vmerge_iv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %cond) { 126; CHECK-LABEL: vmerge_iv_nxv4i8: 127; CHECK: # %bb.0: 128; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 129; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 130; CHECK-NEXT: ret 131 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i8> splat (i8 3), <vscale x 4 x i8> %va 132 ret <vscale x 4 x i8> %vc 133} 134 135define <vscale x 8 x i8> @vmerge_vv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, <vscale x 8 x i1> %cond) { 136; CHECK-LABEL: vmerge_vv_nxv8i8: 137; CHECK: # %bb.0: 138; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 139; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 140; CHECK-NEXT: ret 141 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i8> %va, <vscale x 8 x i8> %vb 142 ret <vscale x 8 x i8> %vc 143} 144 145define <vscale x 8 x i8> @vmerge_xv_nxv8i8(<vscale x 8 x i8> %va, i8 signext %b, <vscale x 8 x i1> %cond) { 146; CHECK-LABEL: vmerge_xv_nxv8i8: 147; CHECK: # %bb.0: 148; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 149; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 150; CHECK-NEXT: ret 151 %head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0 152 %splat = shufflevector <vscale x 8 x i8> %head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 153 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i8> %splat, <vscale x 8 x i8> %va 154 ret <vscale x 8 x i8> %vc 155} 156 157define <vscale x 8 x i8> @vmerge_iv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %cond) { 158; CHECK-LABEL: vmerge_iv_nxv8i8: 159; CHECK: # %bb.0: 160; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 161; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 162; CHECK-NEXT: ret 163 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i8> splat (i8 3), <vscale x 8 x i8> %va 164 ret <vscale x 8 x i8> %vc 165} 166 167define <vscale x 16 x i8> @vmerge_vv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, <vscale x 16 x i1> %cond) { 168; CHECK-LABEL: vmerge_vv_nxv16i8: 169; CHECK: # %bb.0: 170; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 171; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 172; CHECK-NEXT: ret 173 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i8> %va, <vscale x 16 x i8> %vb 174 ret <vscale x 16 x i8> %vc 175} 176 177define <vscale x 16 x i8> @vmerge_xv_nxv16i8(<vscale x 16 x i8> %va, i8 signext %b, <vscale x 16 x i1> %cond) { 178; CHECK-LABEL: vmerge_xv_nxv16i8: 179; CHECK: # %bb.0: 180; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma 181; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 182; CHECK-NEXT: ret 183 %head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0 184 %splat = shufflevector <vscale x 16 x i8> %head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 185 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i8> %splat, <vscale x 16 x i8> %va 186 ret <vscale x 16 x i8> %vc 187} 188 189define <vscale x 16 x i8> @vmerge_iv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %cond) { 190; CHECK-LABEL: vmerge_iv_nxv16i8: 191; CHECK: # %bb.0: 192; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 193; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 194; CHECK-NEXT: ret 195 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i8> splat (i8 3), <vscale x 16 x i8> %va 196 ret <vscale x 16 x i8> %vc 197} 198 199define <vscale x 32 x i8> @vmerge_vv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, <vscale x 32 x i1> %cond) { 200; CHECK-LABEL: vmerge_vv_nxv32i8: 201; CHECK: # %bb.0: 202; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 203; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 204; CHECK-NEXT: ret 205 %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x i8> %va, <vscale x 32 x i8> %vb 206 ret <vscale x 32 x i8> %vc 207} 208 209define <vscale x 32 x i8> @vmerge_xv_nxv32i8(<vscale x 32 x i8> %va, i8 signext %b, <vscale x 32 x i1> %cond) { 210; CHECK-LABEL: vmerge_xv_nxv32i8: 211; CHECK: # %bb.0: 212; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma 213; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 214; CHECK-NEXT: ret 215 %head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0 216 %splat = shufflevector <vscale x 32 x i8> %head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 217 %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x i8> %splat, <vscale x 32 x i8> %va 218 ret <vscale x 32 x i8> %vc 219} 220 221define <vscale x 32 x i8> @vmerge_iv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %cond) { 222; CHECK-LABEL: vmerge_iv_nxv32i8: 223; CHECK: # %bb.0: 224; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 225; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 226; CHECK-NEXT: ret 227 %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x i8> splat (i8 3), <vscale x 32 x i8> %va 228 ret <vscale x 32 x i8> %vc 229} 230 231define <vscale x 64 x i8> @vmerge_vv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, <vscale x 64 x i1> %cond) { 232; CHECK-LABEL: vmerge_vv_nxv64i8: 233; CHECK: # %bb.0: 234; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 235; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 236; CHECK-NEXT: ret 237 %vc = select <vscale x 64 x i1> %cond, <vscale x 64 x i8> %va, <vscale x 64 x i8> %vb 238 ret <vscale x 64 x i8> %vc 239} 240 241define <vscale x 64 x i8> @vmerge_xv_nxv64i8(<vscale x 64 x i8> %va, i8 signext %b, <vscale x 64 x i1> %cond) { 242; CHECK-LABEL: vmerge_xv_nxv64i8: 243; CHECK: # %bb.0: 244; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 245; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 246; CHECK-NEXT: ret 247 %head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0 248 %splat = shufflevector <vscale x 64 x i8> %head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 249 %vc = select <vscale x 64 x i1> %cond, <vscale x 64 x i8> %splat, <vscale x 64 x i8> %va 250 ret <vscale x 64 x i8> %vc 251} 252 253define <vscale x 64 x i8> @vmerge_iv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %cond) { 254; CHECK-LABEL: vmerge_iv_nxv64i8: 255; CHECK: # %bb.0: 256; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 257; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 258; CHECK-NEXT: ret 259 %vc = select <vscale x 64 x i1> %cond, <vscale x 64 x i8> splat (i8 3), <vscale x 64 x i8> %va 260 ret <vscale x 64 x i8> %vc 261} 262 263define <vscale x 1 x i16> @vmerge_vv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, <vscale x 1 x i1> %cond) { 264; CHECK-LABEL: vmerge_vv_nxv1i16: 265; CHECK: # %bb.0: 266; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 267; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 268; CHECK-NEXT: ret 269 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i16> %va, <vscale x 1 x i16> %vb 270 ret <vscale x 1 x i16> %vc 271} 272 273define <vscale x 1 x i16> @vmerge_xv_nxv1i16(<vscale x 1 x i16> %va, i16 signext %b, <vscale x 1 x i1> %cond) { 274; CHECK-LABEL: vmerge_xv_nxv1i16: 275; CHECK: # %bb.0: 276; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 277; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 278; CHECK-NEXT: ret 279 %head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0 280 %splat = shufflevector <vscale x 1 x i16> %head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 281 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i16> %splat, <vscale x 1 x i16> %va 282 ret <vscale x 1 x i16> %vc 283} 284 285define <vscale x 1 x i16> @vmerge_iv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %cond) { 286; CHECK-LABEL: vmerge_iv_nxv1i16: 287; CHECK: # %bb.0: 288; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 289; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 290; CHECK-NEXT: ret 291 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i16> splat (i16 3), <vscale x 1 x i16> %va 292 ret <vscale x 1 x i16> %vc 293} 294 295define <vscale x 2 x i16> @vmerge_vv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, <vscale x 2 x i1> %cond) { 296; CHECK-LABEL: vmerge_vv_nxv2i16: 297; CHECK: # %bb.0: 298; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 299; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 300; CHECK-NEXT: ret 301 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i16> %va, <vscale x 2 x i16> %vb 302 ret <vscale x 2 x i16> %vc 303} 304 305define <vscale x 2 x i16> @vmerge_xv_nxv2i16(<vscale x 2 x i16> %va, i16 signext %b, <vscale x 2 x i1> %cond) { 306; CHECK-LABEL: vmerge_xv_nxv2i16: 307; CHECK: # %bb.0: 308; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 309; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 310; CHECK-NEXT: ret 311 %head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0 312 %splat = shufflevector <vscale x 2 x i16> %head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 313 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i16> %splat, <vscale x 2 x i16> %va 314 ret <vscale x 2 x i16> %vc 315} 316 317define <vscale x 2 x i16> @vmerge_iv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %cond) { 318; CHECK-LABEL: vmerge_iv_nxv2i16: 319; CHECK: # %bb.0: 320; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 321; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 322; CHECK-NEXT: ret 323 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i16> splat (i16 3), <vscale x 2 x i16> %va 324 ret <vscale x 2 x i16> %vc 325} 326 327define <vscale x 4 x i16> @vmerge_vv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, <vscale x 4 x i1> %cond) { 328; CHECK-LABEL: vmerge_vv_nxv4i16: 329; CHECK: # %bb.0: 330; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 331; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 332; CHECK-NEXT: ret 333 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i16> %va, <vscale x 4 x i16> %vb 334 ret <vscale x 4 x i16> %vc 335} 336 337define <vscale x 4 x i16> @vmerge_xv_nxv4i16(<vscale x 4 x i16> %va, i16 signext %b, <vscale x 4 x i1> %cond) { 338; CHECK-LABEL: vmerge_xv_nxv4i16: 339; CHECK: # %bb.0: 340; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 341; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 342; CHECK-NEXT: ret 343 %head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0 344 %splat = shufflevector <vscale x 4 x i16> %head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 345 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i16> %splat, <vscale x 4 x i16> %va 346 ret <vscale x 4 x i16> %vc 347} 348 349define <vscale x 4 x i16> @vmerge_iv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %cond) { 350; CHECK-LABEL: vmerge_iv_nxv4i16: 351; CHECK: # %bb.0: 352; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 353; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 354; CHECK-NEXT: ret 355 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i16> splat (i16 3), <vscale x 4 x i16> %va 356 ret <vscale x 4 x i16> %vc 357} 358 359define <vscale x 8 x i16> @vmerge_vv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, <vscale x 8 x i1> %cond) { 360; CHECK-LABEL: vmerge_vv_nxv8i16: 361; CHECK: # %bb.0: 362; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 363; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 364; CHECK-NEXT: ret 365 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i16> %va, <vscale x 8 x i16> %vb 366 ret <vscale x 8 x i16> %vc 367} 368 369define <vscale x 8 x i16> @vmerge_xv_nxv8i16(<vscale x 8 x i16> %va, i16 signext %b, <vscale x 8 x i1> %cond) { 370; CHECK-LABEL: vmerge_xv_nxv8i16: 371; CHECK: # %bb.0: 372; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 373; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 374; CHECK-NEXT: ret 375 %head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0 376 %splat = shufflevector <vscale x 8 x i16> %head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 377 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i16> %splat, <vscale x 8 x i16> %va 378 ret <vscale x 8 x i16> %vc 379} 380 381define <vscale x 8 x i16> @vmerge_iv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %cond) { 382; CHECK-LABEL: vmerge_iv_nxv8i16: 383; CHECK: # %bb.0: 384; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 385; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 386; CHECK-NEXT: ret 387 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i16> splat (i16 3), <vscale x 8 x i16> %va 388 ret <vscale x 8 x i16> %vc 389} 390 391define <vscale x 16 x i16> @vmerge_vv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, <vscale x 16 x i1> %cond) { 392; CHECK-LABEL: vmerge_vv_nxv16i16: 393; CHECK: # %bb.0: 394; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 395; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 396; CHECK-NEXT: ret 397 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i16> %va, <vscale x 16 x i16> %vb 398 ret <vscale x 16 x i16> %vc 399} 400 401define <vscale x 16 x i16> @vmerge_xv_nxv16i16(<vscale x 16 x i16> %va, i16 signext %b, <vscale x 16 x i1> %cond) { 402; CHECK-LABEL: vmerge_xv_nxv16i16: 403; CHECK: # %bb.0: 404; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 405; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 406; CHECK-NEXT: ret 407 %head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0 408 %splat = shufflevector <vscale x 16 x i16> %head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 409 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i16> %splat, <vscale x 16 x i16> %va 410 ret <vscale x 16 x i16> %vc 411} 412 413define <vscale x 16 x i16> @vmerge_iv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %cond) { 414; CHECK-LABEL: vmerge_iv_nxv16i16: 415; CHECK: # %bb.0: 416; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 417; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 418; CHECK-NEXT: ret 419 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i16> splat (i16 3), <vscale x 16 x i16> %va 420 ret <vscale x 16 x i16> %vc 421} 422 423define <vscale x 32 x i16> @vmerge_vv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, <vscale x 32 x i1> %cond) { 424; CHECK-LABEL: vmerge_vv_nxv32i16: 425; CHECK: # %bb.0: 426; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 427; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 428; CHECK-NEXT: ret 429 %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x i16> %va, <vscale x 32 x i16> %vb 430 ret <vscale x 32 x i16> %vc 431} 432 433define <vscale x 32 x i16> @vmerge_xv_nxv32i16(<vscale x 32 x i16> %va, i16 signext %b, <vscale x 32 x i1> %cond) { 434; CHECK-LABEL: vmerge_xv_nxv32i16: 435; CHECK: # %bb.0: 436; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 437; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 438; CHECK-NEXT: ret 439 %head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0 440 %splat = shufflevector <vscale x 32 x i16> %head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 441 %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x i16> %splat, <vscale x 32 x i16> %va 442 ret <vscale x 32 x i16> %vc 443} 444 445define <vscale x 32 x i16> @vmerge_iv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %cond) { 446; CHECK-LABEL: vmerge_iv_nxv32i16: 447; CHECK: # %bb.0: 448; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 449; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 450; CHECK-NEXT: ret 451 %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x i16> splat (i16 3), <vscale x 32 x i16> %va 452 ret <vscale x 32 x i16> %vc 453} 454 455define <vscale x 1 x i32> @vmerge_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, <vscale x 1 x i1> %cond) { 456; CHECK-LABEL: vmerge_vv_nxv1i32: 457; CHECK: # %bb.0: 458; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 459; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 460; CHECK-NEXT: ret 461 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i32> %va, <vscale x 1 x i32> %vb 462 ret <vscale x 1 x i32> %vc 463} 464 465define <vscale x 1 x i32> @vmerge_xv_nxv1i32(<vscale x 1 x i32> %va, i32 signext %b, <vscale x 1 x i1> %cond) { 466; CHECK-LABEL: vmerge_xv_nxv1i32: 467; CHECK: # %bb.0: 468; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 469; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 470; CHECK-NEXT: ret 471 %head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0 472 %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 473 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i32> %splat, <vscale x 1 x i32> %va 474 ret <vscale x 1 x i32> %vc 475} 476 477define <vscale x 1 x i32> @vmerge_iv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %cond) { 478; CHECK-LABEL: vmerge_iv_nxv1i32: 479; CHECK: # %bb.0: 480; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 481; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 482; CHECK-NEXT: ret 483 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i32> splat (i32 3), <vscale x 1 x i32> %va 484 ret <vscale x 1 x i32> %vc 485} 486 487define <vscale x 2 x i32> @vmerge_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %cond) { 488; CHECK-LABEL: vmerge_vv_nxv2i32: 489; CHECK: # %bb.0: 490; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 491; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 492; CHECK-NEXT: ret 493 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i32> %va, <vscale x 2 x i32> %vb 494 ret <vscale x 2 x i32> %vc 495} 496 497define <vscale x 2 x i32> @vmerge_xv_nxv2i32(<vscale x 2 x i32> %va, i32 signext %b, <vscale x 2 x i1> %cond) { 498; CHECK-LABEL: vmerge_xv_nxv2i32: 499; CHECK: # %bb.0: 500; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma 501; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 502; CHECK-NEXT: ret 503 %head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0 504 %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 505 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i32> %splat, <vscale x 2 x i32> %va 506 ret <vscale x 2 x i32> %vc 507} 508 509define <vscale x 2 x i32> @vmerge_iv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %cond) { 510; CHECK-LABEL: vmerge_iv_nxv2i32: 511; CHECK: # %bb.0: 512; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 513; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 514; CHECK-NEXT: ret 515 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i32> splat (i32 3), <vscale x 2 x i32> %va 516 ret <vscale x 2 x i32> %vc 517} 518 519define <vscale x 4 x i32> @vmerge_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, <vscale x 4 x i1> %cond) { 520; CHECK-LABEL: vmerge_vv_nxv4i32: 521; CHECK: # %bb.0: 522; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 523; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 524; CHECK-NEXT: ret 525 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i32> %va, <vscale x 4 x i32> %vb 526 ret <vscale x 4 x i32> %vc 527} 528 529define <vscale x 4 x i32> @vmerge_xv_nxv4i32(<vscale x 4 x i32> %va, i32 signext %b, <vscale x 4 x i1> %cond) { 530; CHECK-LABEL: vmerge_xv_nxv4i32: 531; CHECK: # %bb.0: 532; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma 533; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 534; CHECK-NEXT: ret 535 %head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0 536 %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 537 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i32> %splat, <vscale x 4 x i32> %va 538 ret <vscale x 4 x i32> %vc 539} 540 541define <vscale x 4 x i32> @vmerge_iv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %cond) { 542; CHECK-LABEL: vmerge_iv_nxv4i32: 543; CHECK: # %bb.0: 544; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 545; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 546; CHECK-NEXT: ret 547 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i32> splat (i32 3), <vscale x 4 x i32> %va 548 ret <vscale x 4 x i32> %vc 549} 550 551define <vscale x 8 x i32> @vmerge_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, <vscale x 8 x i1> %cond) { 552; CHECK-LABEL: vmerge_vv_nxv8i32: 553; CHECK: # %bb.0: 554; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 555; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 556; CHECK-NEXT: ret 557 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i32> %va, <vscale x 8 x i32> %vb 558 ret <vscale x 8 x i32> %vc 559} 560 561define <vscale x 8 x i32> @vmerge_xv_nxv8i32(<vscale x 8 x i32> %va, i32 signext %b, <vscale x 8 x i1> %cond) { 562; CHECK-LABEL: vmerge_xv_nxv8i32: 563; CHECK: # %bb.0: 564; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma 565; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 566; CHECK-NEXT: ret 567 %head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0 568 %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 569 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i32> %splat, <vscale x 8 x i32> %va 570 ret <vscale x 8 x i32> %vc 571} 572 573define <vscale x 8 x i32> @vmerge_iv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %cond) { 574; CHECK-LABEL: vmerge_iv_nxv8i32: 575; CHECK: # %bb.0: 576; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 577; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 578; CHECK-NEXT: ret 579 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i32> splat (i32 3), <vscale x 8 x i32> %va 580 ret <vscale x 8 x i32> %vc 581} 582 583define <vscale x 16 x i32> @vmerge_vv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, <vscale x 16 x i1> %cond) { 584; CHECK-LABEL: vmerge_vv_nxv16i32: 585; CHECK: # %bb.0: 586; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 587; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 588; CHECK-NEXT: ret 589 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i32> %va, <vscale x 16 x i32> %vb 590 ret <vscale x 16 x i32> %vc 591} 592 593define <vscale x 16 x i32> @vmerge_xv_nxv16i32(<vscale x 16 x i32> %va, i32 signext %b, <vscale x 16 x i1> %cond) { 594; CHECK-LABEL: vmerge_xv_nxv16i32: 595; CHECK: # %bb.0: 596; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma 597; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0 598; CHECK-NEXT: ret 599 %head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0 600 %splat = shufflevector <vscale x 16 x i32> %head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 601 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i32> %splat, <vscale x 16 x i32> %va 602 ret <vscale x 16 x i32> %vc 603} 604 605define <vscale x 16 x i32> @vmerge_iv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %cond) { 606; CHECK-LABEL: vmerge_iv_nxv16i32: 607; CHECK: # %bb.0: 608; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 609; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 610; CHECK-NEXT: ret 611 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x i32> splat (i32 3), <vscale x 16 x i32> %va 612 ret <vscale x 16 x i32> %vc 613} 614 615define <vscale x 1 x i64> @vmerge_vv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, <vscale x 1 x i1> %cond) { 616; CHECK-LABEL: vmerge_vv_nxv1i64: 617; CHECK: # %bb.0: 618; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 619; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0 620; CHECK-NEXT: ret 621 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i64> %va, <vscale x 1 x i64> %vb 622 ret <vscale x 1 x i64> %vc 623} 624 625define <vscale x 1 x i64> @vmerge_xv_nxv1i64(<vscale x 1 x i64> %va, i64 %b, <vscale x 1 x i1> %cond) { 626; RV32-LABEL: vmerge_xv_nxv1i64: 627; RV32: # %bb.0: 628; RV32-NEXT: addi sp, sp, -16 629; RV32-NEXT: .cfi_def_cfa_offset 16 630; RV32-NEXT: sw a0, 8(sp) 631; RV32-NEXT: sw a1, 12(sp) 632; RV32-NEXT: addi a0, sp, 8 633; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, mu 634; RV32-NEXT: vlse64.v v8, (a0), zero, v0.t 635; RV32-NEXT: addi sp, sp, 16 636; RV32-NEXT: .cfi_def_cfa_offset 0 637; RV32-NEXT: ret 638; 639; RV64-LABEL: vmerge_xv_nxv1i64: 640; RV64: # %bb.0: 641; RV64-NEXT: vsetvli a1, zero, e64, m1, ta, ma 642; RV64-NEXT: vmerge.vxm v8, v8, a0, v0 643; RV64-NEXT: ret 644 %head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0 645 %splat = shufflevector <vscale x 1 x i64> %head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 646 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i64> %splat, <vscale x 1 x i64> %va 647 ret <vscale x 1 x i64> %vc 648} 649 650define <vscale x 1 x i64> @vmerge_iv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %cond) { 651; CHECK-LABEL: vmerge_iv_nxv1i64: 652; CHECK: # %bb.0: 653; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 654; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 655; CHECK-NEXT: ret 656 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x i64> splat (i64 3), <vscale x 1 x i64> %va 657 ret <vscale x 1 x i64> %vc 658} 659 660define <vscale x 2 x i64> @vmerge_vv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, <vscale x 2 x i1> %cond) { 661; CHECK-LABEL: vmerge_vv_nxv2i64: 662; CHECK: # %bb.0: 663; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 664; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0 665; CHECK-NEXT: ret 666 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i64> %va, <vscale x 2 x i64> %vb 667 ret <vscale x 2 x i64> %vc 668} 669 670define <vscale x 2 x i64> @vmerge_xv_nxv2i64(<vscale x 2 x i64> %va, i64 %b, <vscale x 2 x i1> %cond) { 671; RV32-LABEL: vmerge_xv_nxv2i64: 672; RV32: # %bb.0: 673; RV32-NEXT: addi sp, sp, -16 674; RV32-NEXT: .cfi_def_cfa_offset 16 675; RV32-NEXT: sw a0, 8(sp) 676; RV32-NEXT: sw a1, 12(sp) 677; RV32-NEXT: addi a0, sp, 8 678; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, mu 679; RV32-NEXT: vlse64.v v8, (a0), zero, v0.t 680; RV32-NEXT: addi sp, sp, 16 681; RV32-NEXT: .cfi_def_cfa_offset 0 682; RV32-NEXT: ret 683; 684; RV64-LABEL: vmerge_xv_nxv2i64: 685; RV64: # %bb.0: 686; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma 687; RV64-NEXT: vmerge.vxm v8, v8, a0, v0 688; RV64-NEXT: ret 689 %head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0 690 %splat = shufflevector <vscale x 2 x i64> %head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 691 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i64> %splat, <vscale x 2 x i64> %va 692 ret <vscale x 2 x i64> %vc 693} 694 695define <vscale x 2 x i64> @vmerge_iv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %cond) { 696; CHECK-LABEL: vmerge_iv_nxv2i64: 697; CHECK: # %bb.0: 698; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 699; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 700; CHECK-NEXT: ret 701 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x i64> splat (i64 3), <vscale x 2 x i64> %va 702 ret <vscale x 2 x i64> %vc 703} 704 705define <vscale x 4 x i64> @vmerge_vv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, <vscale x 4 x i1> %cond) { 706; CHECK-LABEL: vmerge_vv_nxv4i64: 707; CHECK: # %bb.0: 708; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 709; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0 710; CHECK-NEXT: ret 711 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i64> %va, <vscale x 4 x i64> %vb 712 ret <vscale x 4 x i64> %vc 713} 714 715define <vscale x 4 x i64> @vmerge_xv_nxv4i64(<vscale x 4 x i64> %va, i64 %b, <vscale x 4 x i1> %cond) { 716; RV32-LABEL: vmerge_xv_nxv4i64: 717; RV32: # %bb.0: 718; RV32-NEXT: addi sp, sp, -16 719; RV32-NEXT: .cfi_def_cfa_offset 16 720; RV32-NEXT: sw a0, 8(sp) 721; RV32-NEXT: sw a1, 12(sp) 722; RV32-NEXT: addi a0, sp, 8 723; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, mu 724; RV32-NEXT: vlse64.v v8, (a0), zero, v0.t 725; RV32-NEXT: addi sp, sp, 16 726; RV32-NEXT: .cfi_def_cfa_offset 0 727; RV32-NEXT: ret 728; 729; RV64-LABEL: vmerge_xv_nxv4i64: 730; RV64: # %bb.0: 731; RV64-NEXT: vsetvli a1, zero, e64, m4, ta, ma 732; RV64-NEXT: vmerge.vxm v8, v8, a0, v0 733; RV64-NEXT: ret 734 %head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0 735 %splat = shufflevector <vscale x 4 x i64> %head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 736 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i64> %splat, <vscale x 4 x i64> %va 737 ret <vscale x 4 x i64> %vc 738} 739 740define <vscale x 4 x i64> @vmerge_iv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %cond) { 741; CHECK-LABEL: vmerge_iv_nxv4i64: 742; CHECK: # %bb.0: 743; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 744; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 745; CHECK-NEXT: ret 746 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x i64> splat (i64 3), <vscale x 4 x i64> %va 747 ret <vscale x 4 x i64> %vc 748} 749 750define <vscale x 8 x i64> @vmerge_vv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, <vscale x 8 x i1> %cond) { 751; CHECK-LABEL: vmerge_vv_nxv8i64: 752; CHECK: # %bb.0: 753; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 754; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0 755; CHECK-NEXT: ret 756 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb 757 ret <vscale x 8 x i64> %vc 758} 759 760define <vscale x 8 x i64> @vmerge_xv_nxv8i64(<vscale x 8 x i64> %va, i64 %b, <vscale x 8 x i1> %cond) { 761; RV32-LABEL: vmerge_xv_nxv8i64: 762; RV32: # %bb.0: 763; RV32-NEXT: addi sp, sp, -16 764; RV32-NEXT: .cfi_def_cfa_offset 16 765; RV32-NEXT: sw a0, 8(sp) 766; RV32-NEXT: sw a1, 12(sp) 767; RV32-NEXT: addi a0, sp, 8 768; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, mu 769; RV32-NEXT: vlse64.v v8, (a0), zero, v0.t 770; RV32-NEXT: addi sp, sp, 16 771; RV32-NEXT: .cfi_def_cfa_offset 0 772; RV32-NEXT: ret 773; 774; RV64-LABEL: vmerge_xv_nxv8i64: 775; RV64: # %bb.0: 776; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma 777; RV64-NEXT: vmerge.vxm v8, v8, a0, v0 778; RV64-NEXT: ret 779 %head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0 780 %splat = shufflevector <vscale x 8 x i64> %head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 781 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i64> %splat, <vscale x 8 x i64> %va 782 ret <vscale x 8 x i64> %vc 783} 784 785define <vscale x 8 x i64> @vmerge_iv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %cond) { 786; CHECK-LABEL: vmerge_iv_nxv8i64: 787; CHECK: # %bb.0: 788; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 789; CHECK-NEXT: vmerge.vim v8, v8, 3, v0 790; CHECK-NEXT: ret 791 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x i64> splat (i64 3), <vscale x 8 x i64> %va 792 ret <vscale x 8 x i64> %vc 793} 794 795define <vscale x 8 x i64> @vmerge_truelhs_nxv8i64_0(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb) { 796; CHECK-LABEL: vmerge_truelhs_nxv8i64_0: 797; CHECK: # %bb.0: 798; CHECK-NEXT: ret 799 %vc = select <vscale x 8 x i1> splat (i1 1), <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb 800 ret <vscale x 8 x i64> %vc 801} 802 803define <vscale x 8 x i64> @vmerge_falselhs_nxv8i64_0(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb) { 804; CHECK-LABEL: vmerge_falselhs_nxv8i64_0: 805; CHECK: # %bb.0: 806; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 807; CHECK-NEXT: vmv8r.v v8, v16 808; CHECK-NEXT: ret 809 %vc = select <vscale x 8 x i1> zeroinitializer, <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb 810 ret <vscale x 8 x i64> %vc 811} 812