1356 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV324; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=lp64d \5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV646; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=ilp32d \7; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV32ZVFHMIN8; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=lp64d \9; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV64ZVFHMIN10 11define <4 x i1> @vpmerge_vv_v4i1(<4 x i1> %va, <4 x i1> %vb, <4 x i1> %m, i32 zeroext %evl) {12; RV32-LABEL: vpmerge_vv_v4i1:13; RV32: # %bb.0:14; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma15; RV32-NEXT: vid.v v1016; RV32-NEXT: vmsltu.vx v10, v10, a017; RV32-NEXT: vmand.mm v9, v9, v1018; RV32-NEXT: vmandn.mm v8, v8, v919; RV32-NEXT: vmand.mm v9, v0, v920; RV32-NEXT: vmor.mm v0, v9, v821; RV32-NEXT: ret22;23; RV64-LABEL: vpmerge_vv_v4i1:24; RV64: # %bb.0:25; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma26; RV64-NEXT: vid.v v1027; RV64-NEXT: vmsltu.vx v12, v10, a028; RV64-NEXT: vmand.mm v9, v9, v1229; RV64-NEXT: vmandn.mm v8, v8, v930; RV64-NEXT: vmand.mm v9, v0, v931; RV64-NEXT: vmor.mm v0, v9, v832; RV64-NEXT: ret33;34; RV32ZVFHMIN-LABEL: vpmerge_vv_v4i1:35; RV32ZVFHMIN: # %bb.0:36; RV32ZVFHMIN-NEXT: vsetivli zero, 4, e32, m1, ta, ma37; RV32ZVFHMIN-NEXT: vid.v v1038; RV32ZVFHMIN-NEXT: vmsltu.vx v10, v10, a039; RV32ZVFHMIN-NEXT: vmand.mm v9, v9, v1040; RV32ZVFHMIN-NEXT: vmandn.mm v8, v8, v941; RV32ZVFHMIN-NEXT: vmand.mm v9, v0, v942; RV32ZVFHMIN-NEXT: vmor.mm v0, v9, v843; RV32ZVFHMIN-NEXT: ret44;45; RV64ZVFHMIN-LABEL: vpmerge_vv_v4i1:46; RV64ZVFHMIN: # %bb.0:47; RV64ZVFHMIN-NEXT: vsetivli zero, 4, e64, m2, ta, ma48; RV64ZVFHMIN-NEXT: vid.v v1049; RV64ZVFHMIN-NEXT: vmsltu.vx v12, v10, a050; RV64ZVFHMIN-NEXT: vmand.mm v9, v9, v1251; RV64ZVFHMIN-NEXT: vmandn.mm v8, v8, v952; RV64ZVFHMIN-NEXT: vmand.mm v9, v0, v953; RV64ZVFHMIN-NEXT: vmor.mm v0, v9, v854; RV64ZVFHMIN-NEXT: ret55 %v = call <4 x i1> @llvm.vp.merge.v4i1(<4 x i1> %m, <4 x i1> %va, <4 x i1> %vb, i32 %evl)56 ret <4 x i1> %v57}58 59define <8 x i1> @vpmerge_vv_v8i1(<8 x i1> %va, <8 x i1> %vb, <8 x i1> %m, i32 zeroext %evl) {60; RV32-LABEL: vpmerge_vv_v8i1:61; RV32: # %bb.0:62; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma63; RV32-NEXT: vid.v v1064; RV32-NEXT: vmsltu.vx v12, v10, a065; RV32-NEXT: vmand.mm v9, v9, v1266; RV32-NEXT: vmandn.mm v8, v8, v967; RV32-NEXT: vmand.mm v9, v0, v968; RV32-NEXT: vmor.mm v0, v9, v869; RV32-NEXT: ret70;71; RV64-LABEL: vpmerge_vv_v8i1:72; RV64: # %bb.0:73; RV64-NEXT: vsetivli zero, 8, e64, m4, ta, ma74; RV64-NEXT: vid.v v1275; RV64-NEXT: vmsltu.vx v10, v12, a076; RV64-NEXT: vmand.mm v9, v9, v1077; RV64-NEXT: vmandn.mm v8, v8, v978; RV64-NEXT: vmand.mm v9, v0, v979; RV64-NEXT: vmor.mm v0, v9, v880; RV64-NEXT: ret81;82; RV32ZVFHMIN-LABEL: vpmerge_vv_v8i1:83; RV32ZVFHMIN: # %bb.0:84; RV32ZVFHMIN-NEXT: vsetivli zero, 8, e32, m2, ta, ma85; RV32ZVFHMIN-NEXT: vid.v v1086; RV32ZVFHMIN-NEXT: vmsltu.vx v12, v10, a087; RV32ZVFHMIN-NEXT: vmand.mm v9, v9, v1288; RV32ZVFHMIN-NEXT: vmandn.mm v8, v8, v989; RV32ZVFHMIN-NEXT: vmand.mm v9, v0, v990; RV32ZVFHMIN-NEXT: vmor.mm v0, v9, v891; RV32ZVFHMIN-NEXT: ret92;93; RV64ZVFHMIN-LABEL: vpmerge_vv_v8i1:94; RV64ZVFHMIN: # %bb.0:95; RV64ZVFHMIN-NEXT: vsetivli zero, 8, e64, m4, ta, ma96; RV64ZVFHMIN-NEXT: vid.v v1297; RV64ZVFHMIN-NEXT: vmsltu.vx v10, v12, a098; RV64ZVFHMIN-NEXT: vmand.mm v9, v9, v1099; RV64ZVFHMIN-NEXT: vmandn.mm v8, v8, v9100; RV64ZVFHMIN-NEXT: vmand.mm v9, v0, v9101; RV64ZVFHMIN-NEXT: vmor.mm v0, v9, v8102; RV64ZVFHMIN-NEXT: ret103 %v = call <8 x i1> @llvm.vp.merge.v8i1(<8 x i1> %m, <8 x i1> %va, <8 x i1> %vb, i32 %evl)104 ret <8 x i1> %v105}106 107define <16 x i1> @vpmerge_vv_v16i1(<16 x i1> %va, <16 x i1> %vb, <16 x i1> %m, i32 zeroext %evl) {108; RV32-LABEL: vpmerge_vv_v16i1:109; RV32: # %bb.0:110; RV32-NEXT: vsetivli zero, 16, e32, m4, ta, ma111; RV32-NEXT: vid.v v12112; RV32-NEXT: vmsltu.vx v10, v12, a0113; RV32-NEXT: vmand.mm v9, v9, v10114; RV32-NEXT: vmandn.mm v8, v8, v9115; RV32-NEXT: vmand.mm v9, v0, v9116; RV32-NEXT: vmor.mm v0, v9, v8117; RV32-NEXT: ret118;119; RV64-LABEL: vpmerge_vv_v16i1:120; RV64: # %bb.0:121; RV64-NEXT: vsetivli zero, 16, e64, m8, ta, ma122; RV64-NEXT: vid.v v16123; RV64-NEXT: vmsltu.vx v10, v16, a0124; RV64-NEXT: vmand.mm v9, v9, v10125; RV64-NEXT: vmandn.mm v8, v8, v9126; RV64-NEXT: vmand.mm v9, v0, v9127; RV64-NEXT: vmor.mm v0, v9, v8128; RV64-NEXT: ret129;130; RV32ZVFHMIN-LABEL: vpmerge_vv_v16i1:131; RV32ZVFHMIN: # %bb.0:132; RV32ZVFHMIN-NEXT: vsetivli zero, 16, e32, m4, ta, ma133; RV32ZVFHMIN-NEXT: vid.v v12134; RV32ZVFHMIN-NEXT: vmsltu.vx v10, v12, a0135; RV32ZVFHMIN-NEXT: vmand.mm v9, v9, v10136; RV32ZVFHMIN-NEXT: vmandn.mm v8, v8, v9137; RV32ZVFHMIN-NEXT: vmand.mm v9, v0, v9138; RV32ZVFHMIN-NEXT: vmor.mm v0, v9, v8139; RV32ZVFHMIN-NEXT: ret140;141; RV64ZVFHMIN-LABEL: vpmerge_vv_v16i1:142; RV64ZVFHMIN: # %bb.0:143; RV64ZVFHMIN-NEXT: vsetivli zero, 16, e64, m8, ta, ma144; RV64ZVFHMIN-NEXT: vid.v v16145; RV64ZVFHMIN-NEXT: vmsltu.vx v10, v16, a0146; RV64ZVFHMIN-NEXT: vmand.mm v9, v9, v10147; RV64ZVFHMIN-NEXT: vmandn.mm v8, v8, v9148; RV64ZVFHMIN-NEXT: vmand.mm v9, v0, v9149; RV64ZVFHMIN-NEXT: vmor.mm v0, v9, v8150; RV64ZVFHMIN-NEXT: ret151 %v = call <16 x i1> @llvm.vp.merge.v16i1(<16 x i1> %m, <16 x i1> %va, <16 x i1> %vb, i32 %evl)152 ret <16 x i1> %v153}154 155define <32 x i1> @vpmerge_vv_v32i1(<32 x i1> %va, <32 x i1> %vb, <32 x i1> %m, i32 zeroext %evl) {156; RV32-LABEL: vpmerge_vv_v32i1:157; RV32: # %bb.0:158; RV32-NEXT: li a1, 32159; RV32-NEXT: vsetvli zero, a1, e32, m8, ta, ma160; RV32-NEXT: vid.v v16161; RV32-NEXT: vmsltu.vx v10, v16, a0162; RV32-NEXT: vmand.mm v9, v9, v10163; RV32-NEXT: vmandn.mm v8, v8, v9164; RV32-NEXT: vmand.mm v9, v0, v9165; RV32-NEXT: vmor.mm v0, v9, v8166; RV32-NEXT: ret167;168; RV64-LABEL: vpmerge_vv_v32i1:169; RV64: # %bb.0:170; RV64-NEXT: vsetvli a1, zero, e8, m2, ta, ma171; RV64-NEXT: vmv.v.i v10, 0172; RV64-NEXT: vsetvli zero, a0, e8, m2, ta, ma173; RV64-NEXT: vmerge.vim v12, v10, 1, v0174; RV64-NEXT: vmv1r.v v0, v8175; RV64-NEXT: vsetvli a1, zero, e8, m2, ta, ma176; RV64-NEXT: vmerge.vim v10, v10, 1, v0177; RV64-NEXT: vmv1r.v v0, v9178; RV64-NEXT: vsetvli zero, a0, e8, m2, tu, ma179; RV64-NEXT: vmerge.vvm v10, v10, v12, v0180; RV64-NEXT: vsetvli a0, zero, e8, m2, ta, ma181; RV64-NEXT: vmsne.vi v0, v10, 0182; RV64-NEXT: ret183;184; RV32ZVFHMIN-LABEL: vpmerge_vv_v32i1:185; RV32ZVFHMIN: # %bb.0:186; RV32ZVFHMIN-NEXT: li a1, 32187; RV32ZVFHMIN-NEXT: vsetvli zero, a1, e32, m8, ta, ma188; RV32ZVFHMIN-NEXT: vid.v v16189; RV32ZVFHMIN-NEXT: vmsltu.vx v10, v16, a0190; RV32ZVFHMIN-NEXT: vmand.mm v9, v9, v10191; RV32ZVFHMIN-NEXT: vmandn.mm v8, v8, v9192; RV32ZVFHMIN-NEXT: vmand.mm v9, v0, v9193; RV32ZVFHMIN-NEXT: vmor.mm v0, v9, v8194; RV32ZVFHMIN-NEXT: ret195;196; RV64ZVFHMIN-LABEL: vpmerge_vv_v32i1:197; RV64ZVFHMIN: # %bb.0:198; RV64ZVFHMIN-NEXT: vsetvli a1, zero, e8, m2, ta, ma199; RV64ZVFHMIN-NEXT: vmv.v.i v10, 0200; RV64ZVFHMIN-NEXT: vsetvli zero, a0, e8, m2, ta, ma201; RV64ZVFHMIN-NEXT: vmerge.vim v12, v10, 1, v0202; RV64ZVFHMIN-NEXT: vmv1r.v v0, v8203; RV64ZVFHMIN-NEXT: vsetvli a1, zero, e8, m2, ta, ma204; RV64ZVFHMIN-NEXT: vmerge.vim v10, v10, 1, v0205; RV64ZVFHMIN-NEXT: vmv1r.v v0, v9206; RV64ZVFHMIN-NEXT: vsetvli zero, a0, e8, m2, tu, ma207; RV64ZVFHMIN-NEXT: vmerge.vvm v10, v10, v12, v0208; RV64ZVFHMIN-NEXT: vsetvli a0, zero, e8, m2, ta, ma209; RV64ZVFHMIN-NEXT: vmsne.vi v0, v10, 0210; RV64ZVFHMIN-NEXT: ret211 %v = call <32 x i1> @llvm.vp.merge.v32i1(<32 x i1> %m, <32 x i1> %va, <32 x i1> %vb, i32 %evl)212 ret <32 x i1> %v213}214 215define <64 x i1> @vpmerge_vv_v64i1(<64 x i1> %va, <64 x i1> %vb, <64 x i1> %m, i32 zeroext %evl) {216; CHECK-LABEL: vpmerge_vv_v64i1:217; CHECK: # %bb.0:218; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma219; CHECK-NEXT: vmv.v.i v12, 0220; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma221; CHECK-NEXT: vmerge.vim v16, v12, 1, v0222; CHECK-NEXT: vmv1r.v v0, v8223; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma224; CHECK-NEXT: vmerge.vim v12, v12, 1, v0225; CHECK-NEXT: vmv1r.v v0, v9226; CHECK-NEXT: vsetvli zero, a0, e8, m4, tu, ma227; CHECK-NEXT: vmerge.vvm v12, v12, v16, v0228; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma229; CHECK-NEXT: vmsne.vi v0, v12, 0230; CHECK-NEXT: ret231 %v = call <64 x i1> @llvm.vp.merge.v64i1(<64 x i1> %m, <64 x i1> %va, <64 x i1> %vb, i32 %evl)232 ret <64 x i1> %v233}234 235define <2 x i8> @vpmerge_vv_v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> %m, i32 zeroext %evl) {236; CHECK-LABEL: vpmerge_vv_v2i8:237; CHECK: # %bb.0:238; CHECK-NEXT: vsetvli zero, a0, e8, mf8, tu, ma239; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0240; CHECK-NEXT: vmv1r.v v8, v9241; CHECK-NEXT: ret242 %v = call <2 x i8> @llvm.vp.merge.v2i8(<2 x i1> %m, <2 x i8> %va, <2 x i8> %vb, i32 %evl)243 ret <2 x i8> %v244}245 246define <2 x i8> @vpmerge_vx_v2i8(i8 %a, <2 x i8> %vb, <2 x i1> %m, i32 zeroext %evl) {247; CHECK-LABEL: vpmerge_vx_v2i8:248; CHECK: # %bb.0:249; CHECK-NEXT: vsetvli zero, a1, e8, mf8, tu, ma250; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0251; CHECK-NEXT: ret252 %elt.head = insertelement <2 x i8> poison, i8 %a, i32 0253 %va = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer254 %v = call <2 x i8> @llvm.vp.merge.v2i8(<2 x i1> %m, <2 x i8> %va, <2 x i8> %vb, i32 %evl)255 ret <2 x i8> %v256}257 258define <2 x i8> @vpmerge_vi_v2i8(<2 x i8> %vb, <2 x i1> %m, i32 zeroext %evl) {259; CHECK-LABEL: vpmerge_vi_v2i8:260; CHECK: # %bb.0:261; CHECK-NEXT: vsetvli zero, a0, e8, mf8, tu, ma262; CHECK-NEXT: vmerge.vim v8, v8, 2, v0263; CHECK-NEXT: ret264 %v = call <2 x i8> @llvm.vp.merge.v2i8(<2 x i1> %m, <2 x i8> splat (i8 2), <2 x i8> %vb, i32 %evl)265 ret <2 x i8> %v266}267 268define <4 x i8> @vpmerge_vv_v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> %m, i32 zeroext %evl) {269; CHECK-LABEL: vpmerge_vv_v4i8:270; CHECK: # %bb.0:271; CHECK-NEXT: vsetvli zero, a0, e8, mf4, tu, ma272; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0273; CHECK-NEXT: vmv1r.v v8, v9274; CHECK-NEXT: ret275 %v = call <4 x i8> @llvm.vp.merge.v4i8(<4 x i1> %m, <4 x i8> %va, <4 x i8> %vb, i32 %evl)276 ret <4 x i8> %v277}278 279define <4 x i8> @vpmerge_vx_v4i8(i8 %a, <4 x i8> %vb, <4 x i1> %m, i32 zeroext %evl) {280; CHECK-LABEL: vpmerge_vx_v4i8:281; CHECK: # %bb.0:282; CHECK-NEXT: vsetvli zero, a1, e8, mf4, tu, ma283; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0284; CHECK-NEXT: ret285 %elt.head = insertelement <4 x i8> poison, i8 %a, i32 0286 %va = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer287 %v = call <4 x i8> @llvm.vp.merge.v4i8(<4 x i1> %m, <4 x i8> %va, <4 x i8> %vb, i32 %evl)288 ret <4 x i8> %v289}290 291define <4 x i8> @vpmerge_vi_v4i8(<4 x i8> %vb, <4 x i1> %m, i32 zeroext %evl) {292; CHECK-LABEL: vpmerge_vi_v4i8:293; CHECK: # %bb.0:294; CHECK-NEXT: vsetvli zero, a0, e8, mf4, tu, ma295; CHECK-NEXT: vmerge.vim v8, v8, 2, v0296; CHECK-NEXT: ret297 %v = call <4 x i8> @llvm.vp.merge.v4i8(<4 x i1> %m, <4 x i8> splat (i8 2), <4 x i8> %vb, i32 %evl)298 ret <4 x i8> %v299}300 301define <6 x i8> @vpmerge_vv_v6i8(<6 x i8> %va, <6 x i8> %vb, <6 x i1> %m, i32 zeroext %evl) {302; CHECK-LABEL: vpmerge_vv_v6i8:303; CHECK: # %bb.0:304; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma305; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0306; CHECK-NEXT: vmv1r.v v8, v9307; CHECK-NEXT: ret308 %v = call <6 x i8> @llvm.vp.merge.v6i8(<6 x i1> %m, <6 x i8> %va, <6 x i8> %vb, i32 %evl)309 ret <6 x i8> %v310}311 312define <6 x i8> @vpmerge_vx_v6i8(i8 %a, <6 x i8> %vb, <6 x i1> %m, i32 zeroext %evl) {313; CHECK-LABEL: vpmerge_vx_v6i8:314; CHECK: # %bb.0:315; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma316; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0317; CHECK-NEXT: ret318 %elt.head = insertelement <6 x i8> poison, i8 %a, i32 0319 %va = shufflevector <6 x i8> %elt.head, <6 x i8> poison, <6 x i32> zeroinitializer320 %v = call <6 x i8> @llvm.vp.merge.v6i8(<6 x i1> %m, <6 x i8> %va, <6 x i8> %vb, i32 %evl)321 ret <6 x i8> %v322}323 324define <6 x i8> @vpmerge_vi_v6i8(<6 x i8> %vb, <6 x i1> %m, i32 zeroext %evl) {325; CHECK-LABEL: vpmerge_vi_v6i8:326; CHECK: # %bb.0:327; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma328; CHECK-NEXT: vmerge.vim v8, v8, 2, v0329; CHECK-NEXT: ret330 %v = call <6 x i8> @llvm.vp.merge.v6i8(<6 x i1> %m, <6 x i8> splat (i8 2), <6 x i8> %vb, i32 %evl)331 ret <6 x i8> %v332}333 334define <8 x i7> @vpmerge_vv_v8i7(<8 x i7> %va, <8 x i7> %vb, <8 x i1> %m, i32 zeroext %evl) {335; CHECK-LABEL: vpmerge_vv_v8i7:336; CHECK: # %bb.0:337; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma338; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0339; CHECK-NEXT: vmv1r.v v8, v9340; CHECK-NEXT: ret341 %v = call <8 x i7> @llvm.vp.merge.v8i7(<8 x i1> %m, <8 x i7> %va, <8 x i7> %vb, i32 %evl)342 ret <8 x i7> %v343}344 345define <8 x i7> @vpmerge_vx_v8i7(i7 %a, <8 x i7> %vb, <8 x i1> %m, i32 zeroext %evl) {346; CHECK-LABEL: vpmerge_vx_v8i7:347; CHECK: # %bb.0:348; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma349; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0350; CHECK-NEXT: ret351 %elt.head = insertelement <8 x i7> poison, i7 %a, i32 0352 %va = shufflevector <8 x i7> %elt.head, <8 x i7> poison, <8 x i32> zeroinitializer353 %v = call <8 x i7> @llvm.vp.merge.v8i7(<8 x i1> %m, <8 x i7> %va, <8 x i7> %vb, i32 %evl)354 ret <8 x i7> %v355}356 357define <8 x i7> @vpmerge_vi_v8i7(<8 x i7> %vb, <8 x i1> %m, i32 zeroext %evl) {358; CHECK-LABEL: vpmerge_vi_v8i7:359; CHECK: # %bb.0:360; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma361; CHECK-NEXT: vmerge.vim v8, v8, 2, v0362; CHECK-NEXT: ret363 %v = call <8 x i7> @llvm.vp.merge.v8i7(<8 x i1> %m, <8 x i7> splat (i7 2), <8 x i7> %vb, i32 %evl)364 ret <8 x i7> %v365}366 367define <8 x i8> @vpmerge_vv_v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> %m, i32 zeroext %evl) {368; CHECK-LABEL: vpmerge_vv_v8i8:369; CHECK: # %bb.0:370; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma371; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0372; CHECK-NEXT: vmv1r.v v8, v9373; CHECK-NEXT: ret374 %v = call <8 x i8> @llvm.vp.merge.v8i8(<8 x i1> %m, <8 x i8> %va, <8 x i8> %vb, i32 %evl)375 ret <8 x i8> %v376}377 378define <8 x i8> @vpmerge_vx_v8i8(i8 %a, <8 x i8> %vb, <8 x i1> %m, i32 zeroext %evl) {379; CHECK-LABEL: vpmerge_vx_v8i8:380; CHECK: # %bb.0:381; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma382; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0383; CHECK-NEXT: ret384 %elt.head = insertelement <8 x i8> poison, i8 %a, i32 0385 %va = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer386 %v = call <8 x i8> @llvm.vp.merge.v8i8(<8 x i1> %m, <8 x i8> %va, <8 x i8> %vb, i32 %evl)387 ret <8 x i8> %v388}389 390define <8 x i8> @vpmerge_vi_v8i8(<8 x i8> %vb, <8 x i1> %m, i32 zeroext %evl) {391; CHECK-LABEL: vpmerge_vi_v8i8:392; CHECK: # %bb.0:393; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma394; CHECK-NEXT: vmerge.vim v8, v8, 2, v0395; CHECK-NEXT: ret396 %v = call <8 x i8> @llvm.vp.merge.v8i8(<8 x i1> %m, <8 x i8> splat (i8 2), <8 x i8> %vb, i32 %evl)397 ret <8 x i8> %v398}399 400define <16 x i8> @vpmerge_vv_v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> %m, i32 zeroext %evl) {401; CHECK-LABEL: vpmerge_vv_v16i8:402; CHECK: # %bb.0:403; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma404; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0405; CHECK-NEXT: vmv1r.v v8, v9406; CHECK-NEXT: ret407 %v = call <16 x i8> @llvm.vp.merge.v16i8(<16 x i1> %m, <16 x i8> %va, <16 x i8> %vb, i32 %evl)408 ret <16 x i8> %v409}410 411define <16 x i8> @vpmerge_vx_v16i8(i8 %a, <16 x i8> %vb, <16 x i1> %m, i32 zeroext %evl) {412; CHECK-LABEL: vpmerge_vx_v16i8:413; CHECK: # %bb.0:414; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, ma415; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0416; CHECK-NEXT: ret417 %elt.head = insertelement <16 x i8> poison, i8 %a, i32 0418 %va = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer419 %v = call <16 x i8> @llvm.vp.merge.v16i8(<16 x i1> %m, <16 x i8> %va, <16 x i8> %vb, i32 %evl)420 ret <16 x i8> %v421}422 423define <16 x i8> @vpmerge_vi_v16i8(<16 x i8> %vb, <16 x i1> %m, i32 zeroext %evl) {424; CHECK-LABEL: vpmerge_vi_v16i8:425; CHECK: # %bb.0:426; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma427; CHECK-NEXT: vmerge.vim v8, v8, 2, v0428; CHECK-NEXT: ret429 %v = call <16 x i8> @llvm.vp.merge.v16i8(<16 x i1> %m, <16 x i8> splat (i8 2), <16 x i8> %vb, i32 %evl)430 ret <16 x i8> %v431}432 433define <2 x i16> @vpmerge_vv_v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> %m, i32 zeroext %evl) {434; CHECK-LABEL: vpmerge_vv_v2i16:435; CHECK: # %bb.0:436; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma437; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0438; CHECK-NEXT: vmv1r.v v8, v9439; CHECK-NEXT: ret440 %v = call <2 x i16> @llvm.vp.merge.v2i16(<2 x i1> %m, <2 x i16> %va, <2 x i16> %vb, i32 %evl)441 ret <2 x i16> %v442}443 444define <2 x i16> @vpmerge_vx_v2i16(i16 %a, <2 x i16> %vb, <2 x i1> %m, i32 zeroext %evl) {445; CHECK-LABEL: vpmerge_vx_v2i16:446; CHECK: # %bb.0:447; CHECK-NEXT: vsetvli zero, a1, e16, mf4, tu, ma448; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0449; CHECK-NEXT: ret450 %elt.head = insertelement <2 x i16> poison, i16 %a, i32 0451 %va = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer452 %v = call <2 x i16> @llvm.vp.merge.v2i16(<2 x i1> %m, <2 x i16> %va, <2 x i16> %vb, i32 %evl)453 ret <2 x i16> %v454}455 456define <2 x i16> @vpmerge_vi_v2i16(<2 x i16> %vb, <2 x i1> %m, i32 zeroext %evl) {457; CHECK-LABEL: vpmerge_vi_v2i16:458; CHECK: # %bb.0:459; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma460; CHECK-NEXT: vmerge.vim v8, v8, 2, v0461; CHECK-NEXT: ret462 %v = call <2 x i16> @llvm.vp.merge.v2i16(<2 x i1> %m, <2 x i16> splat (i16 2), <2 x i16> %vb, i32 %evl)463 ret <2 x i16> %v464}465 466define <4 x i16> @vpmerge_vv_v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> %m, i32 zeroext %evl) {467; CHECK-LABEL: vpmerge_vv_v4i16:468; CHECK: # %bb.0:469; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma470; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0471; CHECK-NEXT: vmv1r.v v8, v9472; CHECK-NEXT: ret473 %v = call <4 x i16> @llvm.vp.merge.v4i16(<4 x i1> %m, <4 x i16> %va, <4 x i16> %vb, i32 %evl)474 ret <4 x i16> %v475}476 477define <4 x i16> @vpmerge_vx_v4i16(i16 %a, <4 x i16> %vb, <4 x i1> %m, i32 zeroext %evl) {478; CHECK-LABEL: vpmerge_vx_v4i16:479; CHECK: # %bb.0:480; CHECK-NEXT: vsetvli zero, a1, e16, mf2, tu, ma481; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0482; CHECK-NEXT: ret483 %elt.head = insertelement <4 x i16> poison, i16 %a, i32 0484 %va = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer485 %v = call <4 x i16> @llvm.vp.merge.v4i16(<4 x i1> %m, <4 x i16> %va, <4 x i16> %vb, i32 %evl)486 ret <4 x i16> %v487}488 489define <4 x i16> @vpmerge_vi_v4i16(<4 x i16> %vb, <4 x i1> %m, i32 zeroext %evl) {490; CHECK-LABEL: vpmerge_vi_v4i16:491; CHECK: # %bb.0:492; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma493; CHECK-NEXT: vmerge.vim v8, v8, 2, v0494; CHECK-NEXT: ret495 %v = call <4 x i16> @llvm.vp.merge.v4i16(<4 x i1> %m, <4 x i16> splat (i16 2), <4 x i16> %vb, i32 %evl)496 ret <4 x i16> %v497}498 499define <8 x i16> @vpmerge_vv_v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> %m, i32 zeroext %evl) {500; CHECK-LABEL: vpmerge_vv_v8i16:501; CHECK: # %bb.0:502; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma503; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0504; CHECK-NEXT: vmv1r.v v8, v9505; CHECK-NEXT: ret506 %v = call <8 x i16> @llvm.vp.merge.v8i16(<8 x i1> %m, <8 x i16> %va, <8 x i16> %vb, i32 %evl)507 ret <8 x i16> %v508}509 510define <8 x i16> @vpmerge_vx_v8i16(i16 %a, <8 x i16> %vb, <8 x i1> %m, i32 zeroext %evl) {511; CHECK-LABEL: vpmerge_vx_v8i16:512; CHECK: # %bb.0:513; CHECK-NEXT: vsetvli zero, a1, e16, m1, tu, ma514; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0515; CHECK-NEXT: ret516 %elt.head = insertelement <8 x i16> poison, i16 %a, i32 0517 %va = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer518 %v = call <8 x i16> @llvm.vp.merge.v8i16(<8 x i1> %m, <8 x i16> %va, <8 x i16> %vb, i32 %evl)519 ret <8 x i16> %v520}521 522define <8 x i16> @vpmerge_vi_v8i16(<8 x i16> %vb, <8 x i1> %m, i32 zeroext %evl) {523; CHECK-LABEL: vpmerge_vi_v8i16:524; CHECK: # %bb.0:525; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma526; CHECK-NEXT: vmerge.vim v8, v8, 2, v0527; CHECK-NEXT: ret528 %v = call <8 x i16> @llvm.vp.merge.v8i16(<8 x i1> %m, <8 x i16> splat (i16 2), <8 x i16> %vb, i32 %evl)529 ret <8 x i16> %v530}531 532define <16 x i16> @vpmerge_vv_v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> %m, i32 zeroext %evl) {533; CHECK-LABEL: vpmerge_vv_v16i16:534; CHECK: # %bb.0:535; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma536; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0537; CHECK-NEXT: vmv2r.v v8, v10538; CHECK-NEXT: ret539 %v = call <16 x i16> @llvm.vp.merge.v16i16(<16 x i1> %m, <16 x i16> %va, <16 x i16> %vb, i32 %evl)540 ret <16 x i16> %v541}542 543define <16 x i16> @vpmerge_vx_v16i16(i16 %a, <16 x i16> %vb, <16 x i1> %m, i32 zeroext %evl) {544; CHECK-LABEL: vpmerge_vx_v16i16:545; CHECK: # %bb.0:546; CHECK-NEXT: vsetvli zero, a1, e16, m2, tu, ma547; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0548; CHECK-NEXT: ret549 %elt.head = insertelement <16 x i16> poison, i16 %a, i32 0550 %va = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer551 %v = call <16 x i16> @llvm.vp.merge.v16i16(<16 x i1> %m, <16 x i16> %va, <16 x i16> %vb, i32 %evl)552 ret <16 x i16> %v553}554 555define <16 x i16> @vpmerge_vi_v16i16(<16 x i16> %vb, <16 x i1> %m, i32 zeroext %evl) {556; CHECK-LABEL: vpmerge_vi_v16i16:557; CHECK: # %bb.0:558; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma559; CHECK-NEXT: vmerge.vim v8, v8, 2, v0560; CHECK-NEXT: ret561 %v = call <16 x i16> @llvm.vp.merge.v16i16(<16 x i1> %m, <16 x i16> splat (i16 2), <16 x i16> %vb, i32 %evl)562 ret <16 x i16> %v563}564 565define <2 x i32> @vpmerge_vv_v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> %m, i32 zeroext %evl) {566; CHECK-LABEL: vpmerge_vv_v2i32:567; CHECK: # %bb.0:568; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma569; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0570; CHECK-NEXT: vmv1r.v v8, v9571; CHECK-NEXT: ret572 %v = call <2 x i32> @llvm.vp.merge.v2i32(<2 x i1> %m, <2 x i32> %va, <2 x i32> %vb, i32 %evl)573 ret <2 x i32> %v574}575 576define <2 x i32> @vpmerge_vx_v2i32(i32 %a, <2 x i32> %vb, <2 x i1> %m, i32 zeroext %evl) {577; CHECK-LABEL: vpmerge_vx_v2i32:578; CHECK: # %bb.0:579; CHECK-NEXT: vsetvli zero, a1, e32, mf2, tu, ma580; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0581; CHECK-NEXT: ret582 %elt.head = insertelement <2 x i32> poison, i32 %a, i32 0583 %va = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer584 %v = call <2 x i32> @llvm.vp.merge.v2i32(<2 x i1> %m, <2 x i32> %va, <2 x i32> %vb, i32 %evl)585 ret <2 x i32> %v586}587 588define <2 x i32> @vpmerge_vi_v2i32(<2 x i32> %vb, <2 x i1> %m, i32 zeroext %evl) {589; CHECK-LABEL: vpmerge_vi_v2i32:590; CHECK: # %bb.0:591; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma592; CHECK-NEXT: vmerge.vim v8, v8, 2, v0593; CHECK-NEXT: ret594 %v = call <2 x i32> @llvm.vp.merge.v2i32(<2 x i1> %m, <2 x i32> splat (i32 2), <2 x i32> %vb, i32 %evl)595 ret <2 x i32> %v596}597 598define <4 x i32> @vpmerge_vv_v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 zeroext %evl) {599; CHECK-LABEL: vpmerge_vv_v4i32:600; CHECK: # %bb.0:601; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma602; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0603; CHECK-NEXT: vmv1r.v v8, v9604; CHECK-NEXT: ret605 %v = call <4 x i32> @llvm.vp.merge.v4i32(<4 x i1> %m, <4 x i32> %va, <4 x i32> %vb, i32 %evl)606 ret <4 x i32> %v607}608 609define <4 x i32> @vpmerge_vx_v4i32(i32 %a, <4 x i32> %vb, <4 x i1> %m, i32 zeroext %evl) {610; CHECK-LABEL: vpmerge_vx_v4i32:611; CHECK: # %bb.0:612; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, ma613; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0614; CHECK-NEXT: ret615 %elt.head = insertelement <4 x i32> poison, i32 %a, i32 0616 %va = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer617 %v = call <4 x i32> @llvm.vp.merge.v4i32(<4 x i1> %m, <4 x i32> %va, <4 x i32> %vb, i32 %evl)618 ret <4 x i32> %v619}620 621define <4 x i32> @vpmerge_vi_v4i32(<4 x i32> %vb, <4 x i1> %m, i32 zeroext %evl) {622; CHECK-LABEL: vpmerge_vi_v4i32:623; CHECK: # %bb.0:624; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma625; CHECK-NEXT: vmerge.vim v8, v8, 2, v0626; CHECK-NEXT: ret627 %v = call <4 x i32> @llvm.vp.merge.v4i32(<4 x i1> %m, <4 x i32> splat (i32 2), <4 x i32> %vb, i32 %evl)628 ret <4 x i32> %v629}630 631define <8 x i32> @vpmerge_vv_v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> %m, i32 zeroext %evl) {632; CHECK-LABEL: vpmerge_vv_v8i32:633; CHECK: # %bb.0:634; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma635; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0636; CHECK-NEXT: vmv2r.v v8, v10637; CHECK-NEXT: ret638 %v = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> %va, <8 x i32> %vb, i32 %evl)639 ret <8 x i32> %v640}641 642define <8 x i32> @vpmerge_vx_v8i32(i32 %a, <8 x i32> %vb, <8 x i1> %m, i32 zeroext %evl) {643; CHECK-LABEL: vpmerge_vx_v8i32:644; CHECK: # %bb.0:645; CHECK-NEXT: vsetvli zero, a1, e32, m2, tu, ma646; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0647; CHECK-NEXT: ret648 %elt.head = insertelement <8 x i32> poison, i32 %a, i32 0649 %va = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer650 %v = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> %va, <8 x i32> %vb, i32 %evl)651 ret <8 x i32> %v652}653 654define <8 x i32> @vpmerge_vi_v8i32(<8 x i32> %vb, <8 x i1> %m, i32 zeroext %evl) {655; CHECK-LABEL: vpmerge_vi_v8i32:656; CHECK: # %bb.0:657; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma658; CHECK-NEXT: vmerge.vim v8, v8, 2, v0659; CHECK-NEXT: ret660 %v = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> splat (i32 2), <8 x i32> %vb, i32 %evl)661 ret <8 x i32> %v662}663 664define <16 x i32> @vpmerge_vv_v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> %m, i32 zeroext %evl) {665; CHECK-LABEL: vpmerge_vv_v16i32:666; CHECK: # %bb.0:667; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma668; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0669; CHECK-NEXT: vmv4r.v v8, v12670; CHECK-NEXT: ret671 %v = call <16 x i32> @llvm.vp.merge.v16i32(<16 x i1> %m, <16 x i32> %va, <16 x i32> %vb, i32 %evl)672 ret <16 x i32> %v673}674 675define <16 x i32> @vpmerge_vx_v16i32(i32 %a, <16 x i32> %vb, <16 x i1> %m, i32 zeroext %evl) {676; CHECK-LABEL: vpmerge_vx_v16i32:677; CHECK: # %bb.0:678; CHECK-NEXT: vsetvli zero, a1, e32, m4, tu, ma679; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0680; CHECK-NEXT: ret681 %elt.head = insertelement <16 x i32> poison, i32 %a, i32 0682 %va = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer683 %v = call <16 x i32> @llvm.vp.merge.v16i32(<16 x i1> %m, <16 x i32> %va, <16 x i32> %vb, i32 %evl)684 ret <16 x i32> %v685}686 687define <16 x i32> @vpmerge_vi_v16i32(<16 x i32> %vb, <16 x i1> %m, i32 zeroext %evl) {688; CHECK-LABEL: vpmerge_vi_v16i32:689; CHECK: # %bb.0:690; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma691; CHECK-NEXT: vmerge.vim v8, v8, 2, v0692; CHECK-NEXT: ret693 %v = call <16 x i32> @llvm.vp.merge.v16i32(<16 x i1> %m, <16 x i32> splat (i32 2), <16 x i32> %vb, i32 %evl)694 ret <16 x i32> %v695}696 697define <2 x i64> @vpmerge_vv_v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> %m, i32 zeroext %evl) {698; CHECK-LABEL: vpmerge_vv_v2i64:699; CHECK: # %bb.0:700; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma701; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0702; CHECK-NEXT: vmv1r.v v8, v9703; CHECK-NEXT: ret704 %v = call <2 x i64> @llvm.vp.merge.v2i64(<2 x i1> %m, <2 x i64> %va, <2 x i64> %vb, i32 %evl)705 ret <2 x i64> %v706}707 708define <2 x i64> @vpmerge_vx_v2i64(i64 %a, <2 x i64> %vb, <2 x i1> %m, i32 zeroext %evl) {709; RV32-LABEL: vpmerge_vx_v2i64:710; RV32: # %bb.0:711; RV32-NEXT: addi sp, sp, -16712; RV32-NEXT: .cfi_def_cfa_offset 16713; RV32-NEXT: sw a0, 8(sp)714; RV32-NEXT: sw a1, 12(sp)715; RV32-NEXT: addi a0, sp, 8716; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma717; RV32-NEXT: vlse64.v v9, (a0), zero718; RV32-NEXT: vsetvli zero, a2, e64, m1, tu, ma719; RV32-NEXT: vmerge.vvm v8, v8, v9, v0720; RV32-NEXT: addi sp, sp, 16721; RV32-NEXT: .cfi_def_cfa_offset 0722; RV32-NEXT: ret723;724; RV64-LABEL: vpmerge_vx_v2i64:725; RV64: # %bb.0:726; RV64-NEXT: vsetvli zero, a1, e64, m1, tu, ma727; RV64-NEXT: vmerge.vxm v8, v8, a0, v0728; RV64-NEXT: ret729;730; RV32ZVFHMIN-LABEL: vpmerge_vx_v2i64:731; RV32ZVFHMIN: # %bb.0:732; RV32ZVFHMIN-NEXT: addi sp, sp, -16733; RV32ZVFHMIN-NEXT: .cfi_def_cfa_offset 16734; RV32ZVFHMIN-NEXT: sw a0, 8(sp)735; RV32ZVFHMIN-NEXT: sw a1, 12(sp)736; RV32ZVFHMIN-NEXT: addi a0, sp, 8737; RV32ZVFHMIN-NEXT: vsetivli zero, 2, e64, m1, ta, ma738; RV32ZVFHMIN-NEXT: vlse64.v v9, (a0), zero739; RV32ZVFHMIN-NEXT: vsetvli zero, a2, e64, m1, tu, ma740; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0741; RV32ZVFHMIN-NEXT: addi sp, sp, 16742; RV32ZVFHMIN-NEXT: .cfi_def_cfa_offset 0743; RV32ZVFHMIN-NEXT: ret744;745; RV64ZVFHMIN-LABEL: vpmerge_vx_v2i64:746; RV64ZVFHMIN: # %bb.0:747; RV64ZVFHMIN-NEXT: vsetvli zero, a1, e64, m1, tu, ma748; RV64ZVFHMIN-NEXT: vmerge.vxm v8, v8, a0, v0749; RV64ZVFHMIN-NEXT: ret750 %elt.head = insertelement <2 x i64> poison, i64 %a, i32 0751 %va = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer752 %v = call <2 x i64> @llvm.vp.merge.v2i64(<2 x i1> %m, <2 x i64> %va, <2 x i64> %vb, i32 %evl)753 ret <2 x i64> %v754}755 756define <2 x i64> @vpmerge_vi_v2i64(<2 x i64> %vb, <2 x i1> %m, i32 zeroext %evl) {757; CHECK-LABEL: vpmerge_vi_v2i64:758; CHECK: # %bb.0:759; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma760; CHECK-NEXT: vmerge.vim v8, v8, 2, v0761; CHECK-NEXT: ret762 %v = call <2 x i64> @llvm.vp.merge.v2i64(<2 x i1> %m, <2 x i64> splat (i64 2), <2 x i64> %vb, i32 %evl)763 ret <2 x i64> %v764}765 766define <4 x i64> @vpmerge_vv_v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> %m, i32 zeroext %evl) {767; CHECK-LABEL: vpmerge_vv_v4i64:768; CHECK: # %bb.0:769; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma770; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0771; CHECK-NEXT: vmv2r.v v8, v10772; CHECK-NEXT: ret773 %v = call <4 x i64> @llvm.vp.merge.v4i64(<4 x i1> %m, <4 x i64> %va, <4 x i64> %vb, i32 %evl)774 ret <4 x i64> %v775}776 777define <4 x i64> @vpmerge_vx_v4i64(i64 %a, <4 x i64> %vb, <4 x i1> %m, i32 zeroext %evl) {778; RV32-LABEL: vpmerge_vx_v4i64:779; RV32: # %bb.0:780; RV32-NEXT: addi sp, sp, -16781; RV32-NEXT: .cfi_def_cfa_offset 16782; RV32-NEXT: sw a0, 8(sp)783; RV32-NEXT: sw a1, 12(sp)784; RV32-NEXT: addi a0, sp, 8785; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma786; RV32-NEXT: vlse64.v v10, (a0), zero787; RV32-NEXT: vsetvli zero, a2, e64, m2, tu, ma788; RV32-NEXT: vmerge.vvm v8, v8, v10, v0789; RV32-NEXT: addi sp, sp, 16790; RV32-NEXT: .cfi_def_cfa_offset 0791; RV32-NEXT: ret792;793; RV64-LABEL: vpmerge_vx_v4i64:794; RV64: # %bb.0:795; RV64-NEXT: vsetvli zero, a1, e64, m2, tu, ma796; RV64-NEXT: vmerge.vxm v8, v8, a0, v0797; RV64-NEXT: ret798;799; RV32ZVFHMIN-LABEL: vpmerge_vx_v4i64:800; RV32ZVFHMIN: # %bb.0:801; RV32ZVFHMIN-NEXT: addi sp, sp, -16802; RV32ZVFHMIN-NEXT: .cfi_def_cfa_offset 16803; RV32ZVFHMIN-NEXT: sw a0, 8(sp)804; RV32ZVFHMIN-NEXT: sw a1, 12(sp)805; RV32ZVFHMIN-NEXT: addi a0, sp, 8806; RV32ZVFHMIN-NEXT: vsetivli zero, 4, e64, m2, ta, ma807; RV32ZVFHMIN-NEXT: vlse64.v v10, (a0), zero808; RV32ZVFHMIN-NEXT: vsetvli zero, a2, e64, m2, tu, ma809; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v10, v0810; RV32ZVFHMIN-NEXT: addi sp, sp, 16811; RV32ZVFHMIN-NEXT: .cfi_def_cfa_offset 0812; RV32ZVFHMIN-NEXT: ret813;814; RV64ZVFHMIN-LABEL: vpmerge_vx_v4i64:815; RV64ZVFHMIN: # %bb.0:816; RV64ZVFHMIN-NEXT: vsetvli zero, a1, e64, m2, tu, ma817; RV64ZVFHMIN-NEXT: vmerge.vxm v8, v8, a0, v0818; RV64ZVFHMIN-NEXT: ret819 %elt.head = insertelement <4 x i64> poison, i64 %a, i32 0820 %va = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer821 %v = call <4 x i64> @llvm.vp.merge.v4i64(<4 x i1> %m, <4 x i64> %va, <4 x i64> %vb, i32 %evl)822 ret <4 x i64> %v823}824 825define <4 x i64> @vpmerge_vi_v4i64(<4 x i64> %vb, <4 x i1> %m, i32 zeroext %evl) {826; CHECK-LABEL: vpmerge_vi_v4i64:827; CHECK: # %bb.0:828; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma829; CHECK-NEXT: vmerge.vim v8, v8, 2, v0830; CHECK-NEXT: ret831 %v = call <4 x i64> @llvm.vp.merge.v4i64(<4 x i1> %m, <4 x i64> splat (i64 2), <4 x i64> %vb, i32 %evl)832 ret <4 x i64> %v833}834 835define <8 x i64> @vpmerge_vv_v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 zeroext %evl) {836; CHECK-LABEL: vpmerge_vv_v8i64:837; CHECK: # %bb.0:838; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma839; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0840; CHECK-NEXT: vmv4r.v v8, v12841; CHECK-NEXT: ret842 %v = call <8 x i64> @llvm.vp.merge.v8i64(<8 x i1> %m, <8 x i64> %va, <8 x i64> %vb, i32 %evl)843 ret <8 x i64> %v844}845 846define <8 x i64> @vpmerge_vx_v8i64(i64 %a, <8 x i64> %vb, <8 x i1> %m, i32 zeroext %evl) {847; RV32-LABEL: vpmerge_vx_v8i64:848; RV32: # %bb.0:849; RV32-NEXT: addi sp, sp, -16850; RV32-NEXT: .cfi_def_cfa_offset 16851; RV32-NEXT: sw a0, 8(sp)852; RV32-NEXT: sw a1, 12(sp)853; RV32-NEXT: addi a0, sp, 8854; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma855; RV32-NEXT: vlse64.v v12, (a0), zero856; RV32-NEXT: vsetvli zero, a2, e64, m4, tu, ma857; RV32-NEXT: vmerge.vvm v8, v8, v12, v0858; RV32-NEXT: addi sp, sp, 16859; RV32-NEXT: .cfi_def_cfa_offset 0860; RV32-NEXT: ret861;862; RV64-LABEL: vpmerge_vx_v8i64:863; RV64: # %bb.0:864; RV64-NEXT: vsetvli zero, a1, e64, m4, tu, ma865; RV64-NEXT: vmerge.vxm v8, v8, a0, v0866; RV64-NEXT: ret867;868; RV32ZVFHMIN-LABEL: vpmerge_vx_v8i64:869; RV32ZVFHMIN: # %bb.0:870; RV32ZVFHMIN-NEXT: addi sp, sp, -16871; RV32ZVFHMIN-NEXT: .cfi_def_cfa_offset 16872; RV32ZVFHMIN-NEXT: sw a0, 8(sp)873; RV32ZVFHMIN-NEXT: sw a1, 12(sp)874; RV32ZVFHMIN-NEXT: addi a0, sp, 8875; RV32ZVFHMIN-NEXT: vsetivli zero, 8, e64, m4, ta, ma876; RV32ZVFHMIN-NEXT: vlse64.v v12, (a0), zero877; RV32ZVFHMIN-NEXT: vsetvli zero, a2, e64, m4, tu, ma878; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v12, v0879; RV32ZVFHMIN-NEXT: addi sp, sp, 16880; RV32ZVFHMIN-NEXT: .cfi_def_cfa_offset 0881; RV32ZVFHMIN-NEXT: ret882;883; RV64ZVFHMIN-LABEL: vpmerge_vx_v8i64:884; RV64ZVFHMIN: # %bb.0:885; RV64ZVFHMIN-NEXT: vsetvli zero, a1, e64, m4, tu, ma886; RV64ZVFHMIN-NEXT: vmerge.vxm v8, v8, a0, v0887; RV64ZVFHMIN-NEXT: ret888 %elt.head = insertelement <8 x i64> poison, i64 %a, i32 0889 %va = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer890 %v = call <8 x i64> @llvm.vp.merge.v8i64(<8 x i1> %m, <8 x i64> %va, <8 x i64> %vb, i32 %evl)891 ret <8 x i64> %v892}893 894define <8 x i64> @vpmerge_vi_v8i64(<8 x i64> %vb, <8 x i1> %m, i32 zeroext %evl) {895; CHECK-LABEL: vpmerge_vi_v8i64:896; CHECK: # %bb.0:897; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma898; CHECK-NEXT: vmerge.vim v8, v8, 2, v0899; CHECK-NEXT: ret900 %v = call <8 x i64> @llvm.vp.merge.v8i64(<8 x i1> %m, <8 x i64> splat (i64 2), <8 x i64> %vb, i32 %evl)901 ret <8 x i64> %v902}903 904define <16 x i64> @vpmerge_vv_v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> %m, i32 zeroext %evl) {905; CHECK-LABEL: vpmerge_vv_v16i64:906; CHECK: # %bb.0:907; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma908; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0909; CHECK-NEXT: vmv8r.v v8, v16910; CHECK-NEXT: ret911 %v = call <16 x i64> @llvm.vp.merge.v16i64(<16 x i1> %m, <16 x i64> %va, <16 x i64> %vb, i32 %evl)912 ret <16 x i64> %v913}914 915define <16 x i64> @vpmerge_vx_v16i64(i64 %a, <16 x i64> %vb, <16 x i1> %m, i32 zeroext %evl) {916; RV32-LABEL: vpmerge_vx_v16i64:917; RV32: # %bb.0:918; RV32-NEXT: addi sp, sp, -16919; RV32-NEXT: .cfi_def_cfa_offset 16920; RV32-NEXT: sw a0, 8(sp)921; RV32-NEXT: sw a1, 12(sp)922; RV32-NEXT: addi a0, sp, 8923; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma924; RV32-NEXT: vlse64.v v16, (a0), zero925; RV32-NEXT: vsetvli zero, a2, e64, m8, tu, ma926; RV32-NEXT: vmerge.vvm v8, v8, v16, v0927; RV32-NEXT: addi sp, sp, 16928; RV32-NEXT: .cfi_def_cfa_offset 0929; RV32-NEXT: ret930;931; RV64-LABEL: vpmerge_vx_v16i64:932; RV64: # %bb.0:933; RV64-NEXT: vsetvli zero, a1, e64, m8, tu, ma934; RV64-NEXT: vmerge.vxm v8, v8, a0, v0935; RV64-NEXT: ret936;937; RV32ZVFHMIN-LABEL: vpmerge_vx_v16i64:938; RV32ZVFHMIN: # %bb.0:939; RV32ZVFHMIN-NEXT: addi sp, sp, -16940; RV32ZVFHMIN-NEXT: .cfi_def_cfa_offset 16941; RV32ZVFHMIN-NEXT: sw a0, 8(sp)942; RV32ZVFHMIN-NEXT: sw a1, 12(sp)943; RV32ZVFHMIN-NEXT: addi a0, sp, 8944; RV32ZVFHMIN-NEXT: vsetivli zero, 16, e64, m8, ta, ma945; RV32ZVFHMIN-NEXT: vlse64.v v16, (a0), zero946; RV32ZVFHMIN-NEXT: vsetvli zero, a2, e64, m8, tu, ma947; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v16, v0948; RV32ZVFHMIN-NEXT: addi sp, sp, 16949; RV32ZVFHMIN-NEXT: .cfi_def_cfa_offset 0950; RV32ZVFHMIN-NEXT: ret951;952; RV64ZVFHMIN-LABEL: vpmerge_vx_v16i64:953; RV64ZVFHMIN: # %bb.0:954; RV64ZVFHMIN-NEXT: vsetvli zero, a1, e64, m8, tu, ma955; RV64ZVFHMIN-NEXT: vmerge.vxm v8, v8, a0, v0956; RV64ZVFHMIN-NEXT: ret957 %elt.head = insertelement <16 x i64> poison, i64 %a, i32 0958 %va = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer959 %v = call <16 x i64> @llvm.vp.merge.v16i64(<16 x i1> %m, <16 x i64> %va, <16 x i64> %vb, i32 %evl)960 ret <16 x i64> %v961}962 963define <16 x i64> @vpmerge_vi_v16i64(<16 x i64> %vb, <16 x i1> %m, i32 zeroext %evl) {964; CHECK-LABEL: vpmerge_vi_v16i64:965; CHECK: # %bb.0:966; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma967; CHECK-NEXT: vmerge.vim v8, v8, 2, v0968; CHECK-NEXT: ret969 %v = call <16 x i64> @llvm.vp.merge.v16i64(<16 x i1> %m, <16 x i64> splat (i64 2), <16 x i64> %vb, i32 %evl)970 ret <16 x i64> %v971}972 973define <2 x half> @vpmerge_vv_v2f16(<2 x half> %va, <2 x half> %vb, <2 x i1> %m, i32 zeroext %evl) {974; CHECK-LABEL: vpmerge_vv_v2f16:975; CHECK: # %bb.0:976; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma977; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0978; CHECK-NEXT: vmv1r.v v8, v9979; CHECK-NEXT: ret980 %v = call <2 x half> @llvm.vp.merge.v2f16(<2 x i1> %m, <2 x half> %va, <2 x half> %vb, i32 %evl)981 ret <2 x half> %v982}983 984define <2 x half> @vpmerge_vf_v2f16(half %a, <2 x half> %vb, <2 x i1> %m, i32 zeroext %evl) {985; ZVFH-LABEL: vpmerge_vf_v2f16:986; ZVFH: # %bb.0:987; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, tu, ma988; ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0989; ZVFH-NEXT: ret990;991; ZVFHMIN-LABEL: vpmerge_vf_v2f16:992; ZVFHMIN: # %bb.0:993; ZVFHMIN-NEXT: fmv.x.h a1, fa0994; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma995; ZVFHMIN-NEXT: vmv.v.x v9, a1996; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, tu, ma997; ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0998; ZVFHMIN-NEXT: ret999 %elt.head = insertelement <2 x half> poison, half %a, i32 01000 %va = shufflevector <2 x half> %elt.head, <2 x half> poison, <2 x i32> zeroinitializer1001 %v = call <2 x half> @llvm.vp.merge.v2f16(<2 x i1> %m, <2 x half> %va, <2 x half> %vb, i32 %evl)1002 ret <2 x half> %v1003}1004 1005define <4 x half> @vpmerge_vv_v4f16(<4 x half> %va, <4 x half> %vb, <4 x i1> %m, i32 zeroext %evl) {1006; CHECK-LABEL: vpmerge_vv_v4f16:1007; CHECK: # %bb.0:1008; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma1009; CHECK-NEXT: vmerge.vvm v9, v9, v8, v01010; CHECK-NEXT: vmv1r.v v8, v91011; CHECK-NEXT: ret1012 %v = call <4 x half> @llvm.vp.merge.v4f16(<4 x i1> %m, <4 x half> %va, <4 x half> %vb, i32 %evl)1013 ret <4 x half> %v1014}1015 1016define <4 x half> @vpmerge_vf_v4f16(half %a, <4 x half> %vb, <4 x i1> %m, i32 zeroext %evl) {1017; ZVFH-LABEL: vpmerge_vf_v4f16:1018; ZVFH: # %bb.0:1019; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, tu, ma1020; ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v01021; ZVFH-NEXT: ret1022;1023; ZVFHMIN-LABEL: vpmerge_vf_v4f16:1024; ZVFHMIN: # %bb.0:1025; ZVFHMIN-NEXT: fmv.x.h a1, fa01026; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma1027; ZVFHMIN-NEXT: vmv.v.x v9, a11028; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, tu, ma1029; ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v01030; ZVFHMIN-NEXT: ret1031 %elt.head = insertelement <4 x half> poison, half %a, i32 01032 %va = shufflevector <4 x half> %elt.head, <4 x half> poison, <4 x i32> zeroinitializer1033 %v = call <4 x half> @llvm.vp.merge.v4f16(<4 x i1> %m, <4 x half> %va, <4 x half> %vb, i32 %evl)1034 ret <4 x half> %v1035}1036 1037define <8 x half> @vpmerge_vv_v8f16(<8 x half> %va, <8 x half> %vb, <8 x i1> %m, i32 zeroext %evl) {1038; CHECK-LABEL: vpmerge_vv_v8f16:1039; CHECK: # %bb.0:1040; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma1041; CHECK-NEXT: vmerge.vvm v9, v9, v8, v01042; CHECK-NEXT: vmv1r.v v8, v91043; CHECK-NEXT: ret1044 %v = call <8 x half> @llvm.vp.merge.v8f16(<8 x i1> %m, <8 x half> %va, <8 x half> %vb, i32 %evl)1045 ret <8 x half> %v1046}1047 1048define <8 x half> @vpmerge_vf_v8f16(half %a, <8 x half> %vb, <8 x i1> %m, i32 zeroext %evl) {1049; ZVFH-LABEL: vpmerge_vf_v8f16:1050; ZVFH: # %bb.0:1051; ZVFH-NEXT: vsetvli zero, a0, e16, m1, tu, ma1052; ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v01053; ZVFH-NEXT: ret1054;1055; ZVFHMIN-LABEL: vpmerge_vf_v8f16:1056; ZVFHMIN: # %bb.0:1057; ZVFHMIN-NEXT: fmv.x.h a1, fa01058; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma1059; ZVFHMIN-NEXT: vmv.v.x v9, a11060; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, tu, ma1061; ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v01062; ZVFHMIN-NEXT: ret1063 %elt.head = insertelement <8 x half> poison, half %a, i32 01064 %va = shufflevector <8 x half> %elt.head, <8 x half> poison, <8 x i32> zeroinitializer1065 %v = call <8 x half> @llvm.vp.merge.v8f16(<8 x i1> %m, <8 x half> %va, <8 x half> %vb, i32 %evl)1066 ret <8 x half> %v1067}1068 1069define <16 x half> @vpmerge_vv_v16f16(<16 x half> %va, <16 x half> %vb, <16 x i1> %m, i32 zeroext %evl) {1070; CHECK-LABEL: vpmerge_vv_v16f16:1071; CHECK: # %bb.0:1072; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma1073; CHECK-NEXT: vmerge.vvm v10, v10, v8, v01074; CHECK-NEXT: vmv2r.v v8, v101075; CHECK-NEXT: ret1076 %v = call <16 x half> @llvm.vp.merge.v16f16(<16 x i1> %m, <16 x half> %va, <16 x half> %vb, i32 %evl)1077 ret <16 x half> %v1078}1079 1080define <16 x half> @vpmerge_vf_v16f16(half %a, <16 x half> %vb, <16 x i1> %m, i32 zeroext %evl) {1081; ZVFH-LABEL: vpmerge_vf_v16f16:1082; ZVFH: # %bb.0:1083; ZVFH-NEXT: vsetvli zero, a0, e16, m2, tu, ma1084; ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v01085; ZVFH-NEXT: ret1086;1087; ZVFHMIN-LABEL: vpmerge_vf_v16f16:1088; ZVFHMIN: # %bb.0:1089; ZVFHMIN-NEXT: fmv.x.h a1, fa01090; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma1091; ZVFHMIN-NEXT: vmv.v.x v10, a11092; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, tu, ma1093; ZVFHMIN-NEXT: vmerge.vvm v8, v8, v10, v01094; ZVFHMIN-NEXT: ret1095 %elt.head = insertelement <16 x half> poison, half %a, i32 01096 %va = shufflevector <16 x half> %elt.head, <16 x half> poison, <16 x i32> zeroinitializer1097 %v = call <16 x half> @llvm.vp.merge.v16f16(<16 x i1> %m, <16 x half> %va, <16 x half> %vb, i32 %evl)1098 ret <16 x half> %v1099}1100 1101define <2 x float> @vpmerge_vv_v2f32(<2 x float> %va, <2 x float> %vb, <2 x i1> %m, i32 zeroext %evl) {1102; CHECK-LABEL: vpmerge_vv_v2f32:1103; CHECK: # %bb.0:1104; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma1105; CHECK-NEXT: vmerge.vvm v9, v9, v8, v01106; CHECK-NEXT: vmv1r.v v8, v91107; CHECK-NEXT: ret1108 %v = call <2 x float> @llvm.vp.merge.v2f32(<2 x i1> %m, <2 x float> %va, <2 x float> %vb, i32 %evl)1109 ret <2 x float> %v1110}1111 1112define <2 x float> @vpmerge_vf_v2f32(float %a, <2 x float> %vb, <2 x i1> %m, i32 zeroext %evl) {1113; CHECK-LABEL: vpmerge_vf_v2f32:1114; CHECK: # %bb.0:1115; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma1116; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01117; CHECK-NEXT: ret1118 %elt.head = insertelement <2 x float> poison, float %a, i32 01119 %va = shufflevector <2 x float> %elt.head, <2 x float> poison, <2 x i32> zeroinitializer1120 %v = call <2 x float> @llvm.vp.merge.v2f32(<2 x i1> %m, <2 x float> %va, <2 x float> %vb, i32 %evl)1121 ret <2 x float> %v1122}1123 1124define <4 x float> @vpmerge_vv_v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> %m, i32 zeroext %evl) {1125; CHECK-LABEL: vpmerge_vv_v4f32:1126; CHECK: # %bb.0:1127; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma1128; CHECK-NEXT: vmerge.vvm v9, v9, v8, v01129; CHECK-NEXT: vmv1r.v v8, v91130; CHECK-NEXT: ret1131 %v = call <4 x float> @llvm.vp.merge.v4f32(<4 x i1> %m, <4 x float> %va, <4 x float> %vb, i32 %evl)1132 ret <4 x float> %v1133}1134 1135define <4 x float> @vpmerge_vf_v4f32(float %a, <4 x float> %vb, <4 x i1> %m, i32 zeroext %evl) {1136; CHECK-LABEL: vpmerge_vf_v4f32:1137; CHECK: # %bb.0:1138; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma1139; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01140; CHECK-NEXT: ret1141 %elt.head = insertelement <4 x float> poison, float %a, i32 01142 %va = shufflevector <4 x float> %elt.head, <4 x float> poison, <4 x i32> zeroinitializer1143 %v = call <4 x float> @llvm.vp.merge.v4f32(<4 x i1> %m, <4 x float> %va, <4 x float> %vb, i32 %evl)1144 ret <4 x float> %v1145}1146 1147define <8 x float> @vpmerge_vv_v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> %m, i32 zeroext %evl) {1148; CHECK-LABEL: vpmerge_vv_v8f32:1149; CHECK: # %bb.0:1150; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma1151; CHECK-NEXT: vmerge.vvm v10, v10, v8, v01152; CHECK-NEXT: vmv2r.v v8, v101153; CHECK-NEXT: ret1154 %v = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> %m, <8 x float> %va, <8 x float> %vb, i32 %evl)1155 ret <8 x float> %v1156}1157 1158define <8 x float> @vpmerge_vf_v8f32(float %a, <8 x float> %vb, <8 x i1> %m, i32 zeroext %evl) {1159; CHECK-LABEL: vpmerge_vf_v8f32:1160; CHECK: # %bb.0:1161; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma1162; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01163; CHECK-NEXT: ret1164 %elt.head = insertelement <8 x float> poison, float %a, i32 01165 %va = shufflevector <8 x float> %elt.head, <8 x float> poison, <8 x i32> zeroinitializer1166 %v = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> %m, <8 x float> %va, <8 x float> %vb, i32 %evl)1167 ret <8 x float> %v1168}1169 1170define <16 x float> @vpmerge_vv_v16f32(<16 x float> %va, <16 x float> %vb, <16 x i1> %m, i32 zeroext %evl) {1171; CHECK-LABEL: vpmerge_vv_v16f32:1172; CHECK: # %bb.0:1173; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma1174; CHECK-NEXT: vmerge.vvm v12, v12, v8, v01175; CHECK-NEXT: vmv4r.v v8, v121176; CHECK-NEXT: ret1177 %v = call <16 x float> @llvm.vp.merge.v16f32(<16 x i1> %m, <16 x float> %va, <16 x float> %vb, i32 %evl)1178 ret <16 x float> %v1179}1180 1181define <16 x float> @vpmerge_vf_v16f32(float %a, <16 x float> %vb, <16 x i1> %m, i32 zeroext %evl) {1182; CHECK-LABEL: vpmerge_vf_v16f32:1183; CHECK: # %bb.0:1184; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma1185; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01186; CHECK-NEXT: ret1187 %elt.head = insertelement <16 x float> poison, float %a, i32 01188 %va = shufflevector <16 x float> %elt.head, <16 x float> poison, <16 x i32> zeroinitializer1189 %v = call <16 x float> @llvm.vp.merge.v16f32(<16 x i1> %m, <16 x float> %va, <16 x float> %vb, i32 %evl)1190 ret <16 x float> %v1191}1192 1193define <2 x double> @vpmerge_vv_v2f64(<2 x double> %va, <2 x double> %vb, <2 x i1> %m, i32 zeroext %evl) {1194; CHECK-LABEL: vpmerge_vv_v2f64:1195; CHECK: # %bb.0:1196; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma1197; CHECK-NEXT: vmerge.vvm v9, v9, v8, v01198; CHECK-NEXT: vmv1r.v v8, v91199; CHECK-NEXT: ret1200 %v = call <2 x double> @llvm.vp.merge.v2f64(<2 x i1> %m, <2 x double> %va, <2 x double> %vb, i32 %evl)1201 ret <2 x double> %v1202}1203 1204define <2 x double> @vpmerge_vf_v2f64(double %a, <2 x double> %vb, <2 x i1> %m, i32 zeroext %evl) {1205; CHECK-LABEL: vpmerge_vf_v2f64:1206; CHECK: # %bb.0:1207; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma1208; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01209; CHECK-NEXT: ret1210 %elt.head = insertelement <2 x double> poison, double %a, i32 01211 %va = shufflevector <2 x double> %elt.head, <2 x double> poison, <2 x i32> zeroinitializer1212 %v = call <2 x double> @llvm.vp.merge.v2f64(<2 x i1> %m, <2 x double> %va, <2 x double> %vb, i32 %evl)1213 ret <2 x double> %v1214}1215 1216define <4 x double> @vpmerge_vv_v4f64(<4 x double> %va, <4 x double> %vb, <4 x i1> %m, i32 zeroext %evl) {1217; CHECK-LABEL: vpmerge_vv_v4f64:1218; CHECK: # %bb.0:1219; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma1220; CHECK-NEXT: vmerge.vvm v10, v10, v8, v01221; CHECK-NEXT: vmv2r.v v8, v101222; CHECK-NEXT: ret1223 %v = call <4 x double> @llvm.vp.merge.v4f64(<4 x i1> %m, <4 x double> %va, <4 x double> %vb, i32 %evl)1224 ret <4 x double> %v1225}1226 1227define <4 x double> @vpmerge_vf_v4f64(double %a, <4 x double> %vb, <4 x i1> %m, i32 zeroext %evl) {1228; CHECK-LABEL: vpmerge_vf_v4f64:1229; CHECK: # %bb.0:1230; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma1231; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01232; CHECK-NEXT: ret1233 %elt.head = insertelement <4 x double> poison, double %a, i32 01234 %va = shufflevector <4 x double> %elt.head, <4 x double> poison, <4 x i32> zeroinitializer1235 %v = call <4 x double> @llvm.vp.merge.v4f64(<4 x i1> %m, <4 x double> %va, <4 x double> %vb, i32 %evl)1236 ret <4 x double> %v1237}1238 1239define <8 x double> @vpmerge_vv_v8f64(<8 x double> %va, <8 x double> %vb, <8 x i1> %m, i32 zeroext %evl) {1240; CHECK-LABEL: vpmerge_vv_v8f64:1241; CHECK: # %bb.0:1242; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma1243; CHECK-NEXT: vmerge.vvm v12, v12, v8, v01244; CHECK-NEXT: vmv4r.v v8, v121245; CHECK-NEXT: ret1246 %v = call <8 x double> @llvm.vp.merge.v8f64(<8 x i1> %m, <8 x double> %va, <8 x double> %vb, i32 %evl)1247 ret <8 x double> %v1248}1249 1250define <8 x double> @vpmerge_vf_v8f64(double %a, <8 x double> %vb, <8 x i1> %m, i32 zeroext %evl) {1251; CHECK-LABEL: vpmerge_vf_v8f64:1252; CHECK: # %bb.0:1253; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma1254; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01255; CHECK-NEXT: ret1256 %elt.head = insertelement <8 x double> poison, double %a, i32 01257 %va = shufflevector <8 x double> %elt.head, <8 x double> poison, <8 x i32> zeroinitializer1258 %v = call <8 x double> @llvm.vp.merge.v8f64(<8 x i1> %m, <8 x double> %va, <8 x double> %vb, i32 %evl)1259 ret <8 x double> %v1260}1261 1262define <16 x double> @vpmerge_vv_v16f64(<16 x double> %va, <16 x double> %vb, <16 x i1> %m, i32 zeroext %evl) {1263; CHECK-LABEL: vpmerge_vv_v16f64:1264; CHECK: # %bb.0:1265; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma1266; CHECK-NEXT: vmerge.vvm v16, v16, v8, v01267; CHECK-NEXT: vmv8r.v v8, v161268; CHECK-NEXT: ret1269 %v = call <16 x double> @llvm.vp.merge.v16f64(<16 x i1> %m, <16 x double> %va, <16 x double> %vb, i32 %evl)1270 ret <16 x double> %v1271}1272 1273define <16 x double> @vpmerge_vf_v16f64(double %a, <16 x double> %vb, <16 x i1> %m, i32 zeroext %evl) {1274; CHECK-LABEL: vpmerge_vf_v16f64:1275; CHECK: # %bb.0:1276; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma1277; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01278; CHECK-NEXT: ret1279 %elt.head = insertelement <16 x double> poison, double %a, i32 01280 %va = shufflevector <16 x double> %elt.head, <16 x double> poison, <16 x i32> zeroinitializer1281 %v = call <16 x double> @llvm.vp.merge.v16f64(<16 x i1> %m, <16 x double> %va, <16 x double> %vb, i32 %evl)1282 ret <16 x double> %v1283}1284 1285define <32 x double> @vpmerge_vv_v32f64(<32 x double> %va, <32 x double> %vb, <32 x i1> %m, i32 zeroext %evl) {1286; CHECK-LABEL: vpmerge_vv_v32f64:1287; CHECK: # %bb.0:1288; CHECK-NEXT: addi sp, sp, -161289; CHECK-NEXT: .cfi_def_cfa_offset 161290; CHECK-NEXT: csrr a1, vlenb1291; CHECK-NEXT: slli a1, a1, 31292; CHECK-NEXT: sub sp, sp, a11293; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb1294; CHECK-NEXT: addi a1, sp, 161295; CHECK-NEXT: vs8r.v v16, (a1) # vscale x 64-byte Folded Spill1296; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma1297; CHECK-NEXT: vmv8r.v v16, v81298; CHECK-NEXT: addi a1, a0, 1281299; CHECK-NEXT: vle64.v v24, (a1)1300; CHECK-NEXT: vle64.v v8, (a0)1301; CHECK-NEXT: li a1, 161302; CHECK-NEXT: mv a0, a21303; CHECK-NEXT: bltu a2, a1, .LBB83_21304; CHECK-NEXT: # %bb.1:1305; CHECK-NEXT: li a0, 161306; CHECK-NEXT: .LBB83_2:1307; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma1308; CHECK-NEXT: vmerge.vvm v8, v8, v16, v01309; CHECK-NEXT: addi a0, a2, -161310; CHECK-NEXT: sltu a1, a2, a01311; CHECK-NEXT: addi a1, a1, -11312; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma1313; CHECK-NEXT: vslidedown.vi v0, v0, 21314; CHECK-NEXT: and a0, a1, a01315; CHECK-NEXT: addi a1, sp, 161316; CHECK-NEXT: vl8r.v v16, (a1) # vscale x 64-byte Folded Reload1317; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma1318; CHECK-NEXT: vmerge.vvm v24, v24, v16, v01319; CHECK-NEXT: vmv8r.v v16, v241320; CHECK-NEXT: csrr a0, vlenb1321; CHECK-NEXT: slli a0, a0, 31322; CHECK-NEXT: add sp, sp, a01323; CHECK-NEXT: .cfi_def_cfa sp, 161324; CHECK-NEXT: addi sp, sp, 161325; CHECK-NEXT: .cfi_def_cfa_offset 01326; CHECK-NEXT: ret1327 %v = call <32 x double> @llvm.vp.merge.v32f64(<32 x i1> %m, <32 x double> %va, <32 x double> %vb, i32 %evl)1328 ret <32 x double> %v1329}1330 1331define <32 x double> @vpmerge_vf_v32f64(double %a, <32 x double> %vb, <32 x i1> %m, i32 zeroext %evl) {1332; CHECK-LABEL: vpmerge_vf_v32f64:1333; CHECK: # %bb.0:1334; CHECK-NEXT: li a2, 161335; CHECK-NEXT: mv a1, a01336; CHECK-NEXT: bltu a0, a2, .LBB84_21337; CHECK-NEXT: # %bb.1:1338; CHECK-NEXT: li a1, 161339; CHECK-NEXT: .LBB84_2:1340; CHECK-NEXT: vsetvli zero, a1, e64, m8, tu, ma1341; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v01342; CHECK-NEXT: addi a1, a0, -161343; CHECK-NEXT: sltu a0, a0, a11344; CHECK-NEXT: addi a0, a0, -11345; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma1346; CHECK-NEXT: vslidedown.vi v0, v0, 21347; CHECK-NEXT: and a0, a0, a11348; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma1349; CHECK-NEXT: vfmerge.vfm v16, v16, fa0, v01350; CHECK-NEXT: ret1351 %elt.head = insertelement <32 x double> poison, double %a, i32 01352 %va = shufflevector <32 x double> %elt.head, <32 x double> poison, <32 x i32> zeroinitializer1353 %v = call <32 x double> @llvm.vp.merge.v32f64(<32 x i1> %m, <32 x double> %va, <32 x double> %vb, i32 %evl)1354 ret <32 x double> %v1355}1356