; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefix=NOVLDEP ; RUN: llc -mtriple=riscv64 -mattr=+v,+vl-dependent-latency -verify-machineinstrs < %s | FileCheck %s --check-prefix=VLDEP define @test_vp_splice_nxv1i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv1i1: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf8, ta, ma ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v9, v9, 1 ; NOVLDEP-NEXT: addi a0, a0, -1 ; NOVLDEP-NEXT: vslideup.vx v9, v8, a0 ; NOVLDEP-NEXT: vmsne.vi v0, v9, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv1i1: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf8, ta, ma ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; VLDEP-NEXT: addi a0, a0, -1 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf8, ta, ma ; VLDEP-NEXT: vslidedown.vi v9, v9, 1 ; VLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; VLDEP-NEXT: vslideup.vx v9, v8, a0 ; VLDEP-NEXT: vmsne.vi v0, v9, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 1, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv1i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv1i1_negative_offset: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf8, ta, ma ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -2 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; NOVLDEP-NEXT: vslidedown.vx v9, v9, a0 ; NOVLDEP-NEXT: vslideup.vi v9, v8, 2 ; NOVLDEP-NEXT: vmsne.vi v0, v9, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv1i1_negative_offset: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf8, ta, ma ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; VLDEP-NEXT: addi a0, a0, -2 ; VLDEP-NEXT: vsetivli zero, 2, e8, mf8, ta, ma ; VLDEP-NEXT: vslidedown.vx v9, v9, a0 ; VLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; VLDEP-NEXT: vslideup.vi v9, v8, 2 ; VLDEP-NEXT: vmsne.vi v0, v9, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 -2, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv1i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv1i1_masked: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; NOVLDEP-NEXT: vmv1r.v v10, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf8, ta, ma ; NOVLDEP-NEXT: vmv.v.i v11, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vmerge.vim v10, v11, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -1 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v10, v10, 1, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, mf8, ta, mu ; NOVLDEP-NEXT: vslideup.vx v10, v8, a0, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, mf8, ta, ma ; NOVLDEP-NEXT: vmsne.vi v0, v10, 0, v0.t ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv1i1_masked: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, ma ; VLDEP-NEXT: vmv1r.v v10, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf8, ta, ma ; VLDEP-NEXT: vmv.v.i v11, 0 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vmerge.vim v10, v11, 1, v0 ; VLDEP-NEXT: addi a0, a0, -1 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf8, ta, ma ; VLDEP-NEXT: vslidedown.vi v10, v10, 1, v0.t ; VLDEP-NEXT: vsetvli zero, a1, e8, mf8, ta, mu ; VLDEP-NEXT: vslideup.vx v10, v8, a0, v0.t ; VLDEP-NEXT: vsetvli zero, zero, e8, mf8, ta, ma ; VLDEP-NEXT: vmsne.vi v0, v10, 0, v0.t ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv1i1( %va, %vb, i32 1, %mask, i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv2i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv2i1: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf4, ta, ma ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v9, v9, 3 ; NOVLDEP-NEXT: addi a0, a0, -3 ; NOVLDEP-NEXT: vslideup.vx v9, v8, a0 ; NOVLDEP-NEXT: vmsne.vi v0, v9, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv2i1: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf4, ta, ma ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; VLDEP-NEXT: addi a0, a0, -3 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf4, ta, ma ; VLDEP-NEXT: vslidedown.vi v9, v9, 3 ; VLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; VLDEP-NEXT: vslideup.vx v9, v8, a0 ; VLDEP-NEXT: vmsne.vi v0, v9, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 3, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv2i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv2i1_negative_offset: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf4, ta, ma ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -4 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; NOVLDEP-NEXT: vslidedown.vx v9, v9, a0 ; NOVLDEP-NEXT: vslideup.vi v9, v8, 4 ; NOVLDEP-NEXT: vmsne.vi v0, v9, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv2i1_negative_offset: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf4, ta, ma ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; VLDEP-NEXT: addi a0, a0, -4 ; VLDEP-NEXT: vsetivli zero, 4, e8, mf4, ta, ma ; VLDEP-NEXT: vslidedown.vx v9, v9, a0 ; VLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; VLDEP-NEXT: vslideup.vi v9, v8, 4 ; VLDEP-NEXT: vmsne.vi v0, v9, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 -4, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv2i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv2i1_masked: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; NOVLDEP-NEXT: vmv1r.v v10, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf4, ta, ma ; NOVLDEP-NEXT: vmv.v.i v11, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vmerge.vim v10, v11, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -3 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v10, v10, 3, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, mf4, ta, mu ; NOVLDEP-NEXT: vslideup.vx v10, v8, a0, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, mf4, ta, ma ; NOVLDEP-NEXT: vmsne.vi v0, v10, 0, v0.t ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv2i1_masked: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, ma ; VLDEP-NEXT: vmv1r.v v10, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf4, ta, ma ; VLDEP-NEXT: vmv.v.i v11, 0 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vmerge.vim v10, v11, 1, v0 ; VLDEP-NEXT: addi a0, a0, -3 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf4, ta, ma ; VLDEP-NEXT: vslidedown.vi v10, v10, 3, v0.t ; VLDEP-NEXT: vsetvli zero, a1, e8, mf4, ta, mu ; VLDEP-NEXT: vslideup.vx v10, v8, a0, v0.t ; VLDEP-NEXT: vsetvli zero, zero, e8, mf4, ta, ma ; VLDEP-NEXT: vmsne.vi v0, v10, 0, v0.t ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv2i1( %va, %vb, i32 3, %mask, i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv4i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv4i1: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v9, v9, 5 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vslideup.vx v9, v8, a0 ; NOVLDEP-NEXT: vmsne.vi v0, v9, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv4i1: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; VLDEP-NEXT: vslidedown.vi v9, v9, 5 ; VLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; VLDEP-NEXT: vslideup.vx v9, v8, a0 ; VLDEP-NEXT: vmsne.vi v0, v9, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv4i1( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv4i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv4i1_negative_offset: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; NOVLDEP-NEXT: vslidedown.vx v9, v9, a0 ; NOVLDEP-NEXT: vslideup.vi v9, v8, 5 ; NOVLDEP-NEXT: vmsne.vi v0, v9, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv4i1_negative_offset: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetivli zero, 5, e8, mf2, ta, ma ; VLDEP-NEXT: vslidedown.vx v9, v9, a0 ; VLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; VLDEP-NEXT: vslideup.vi v9, v8, 5 ; VLDEP-NEXT: vmsne.vi v0, v9, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv4i1( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv4i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv4i1_masked: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; NOVLDEP-NEXT: vmv1r.v v10, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; NOVLDEP-NEXT: vmv.v.i v11, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vmerge.vim v10, v11, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v10, v10, 5, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, mf2, ta, mu ; NOVLDEP-NEXT: vslideup.vx v10, v8, a0, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, mf2, ta, ma ; NOVLDEP-NEXT: vmsne.vi v0, v10, 0, v0.t ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv4i1_masked: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, ma ; VLDEP-NEXT: vmv1r.v v10, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; VLDEP-NEXT: vmv.v.i v11, 0 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vmerge.vim v10, v11, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; VLDEP-NEXT: vslidedown.vi v10, v10, 5, v0.t ; VLDEP-NEXT: vsetvli zero, a1, e8, mf2, ta, mu ; VLDEP-NEXT: vslideup.vx v10, v8, a0, v0.t ; VLDEP-NEXT: vsetvli zero, zero, e8, mf2, ta, ma ; VLDEP-NEXT: vmsne.vi v0, v10, 0, v0.t ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv4i1( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv8i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv8i1: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m1, ta, ma ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v9, v9, 5 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vslideup.vx v9, v8, a0 ; NOVLDEP-NEXT: vmsne.vi v0, v9, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv8i1: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m1, ta, ma ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetvli zero, a0, e8, m1, ta, ma ; VLDEP-NEXT: vslidedown.vi v9, v9, 5 ; VLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; VLDEP-NEXT: vslideup.vx v9, v8, a0 ; VLDEP-NEXT: vmsne.vi v0, v9, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv8i1( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv8i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv8i1_negative_offset: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m1, ta, ma ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; NOVLDEP-NEXT: vslidedown.vx v9, v9, a0 ; NOVLDEP-NEXT: vslideup.vi v9, v8, 5 ; NOVLDEP-NEXT: vmsne.vi v0, v9, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv8i1_negative_offset: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m1, ta, ma ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v9, v10, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetivli zero, 5, e8, m1, ta, ma ; VLDEP-NEXT: vslidedown.vx v9, v9, a0 ; VLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; VLDEP-NEXT: vslideup.vi v9, v8, 5 ; VLDEP-NEXT: vmsne.vi v0, v9, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv8i1( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv8i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv8i1_masked: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; NOVLDEP-NEXT: vmv1r.v v10, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v8, 0 ; NOVLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m1, ta, ma ; NOVLDEP-NEXT: vmv.v.i v11, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vmerge.vim v10, v11, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v10, v10, 5, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, m1, ta, mu ; NOVLDEP-NEXT: vslideup.vx v10, v8, a0, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, m1, ta, ma ; NOVLDEP-NEXT: vmsne.vi v0, v10, 0, v0.t ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv8i1_masked: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, ma ; VLDEP-NEXT: vmv1r.v v10, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v8, 0 ; VLDEP-NEXT: vmerge.vim v8, v8, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m1, ta, ma ; VLDEP-NEXT: vmv.v.i v11, 0 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vmerge.vim v10, v11, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli zero, a0, e8, m1, ta, ma ; VLDEP-NEXT: vslidedown.vi v10, v10, 5, v0.t ; VLDEP-NEXT: vsetvli zero, a1, e8, m1, ta, mu ; VLDEP-NEXT: vslideup.vx v10, v8, a0, v0.t ; VLDEP-NEXT: vsetvli zero, zero, e8, m1, ta, ma ; VLDEP-NEXT: vmsne.vi v0, v10, 0, v0.t ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv8i1( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv16i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv16i1: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmerge.vim v10, v10, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m2, ta, ma ; NOVLDEP-NEXT: vmv.v.i v12, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v8, v12, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v8, v8, 5 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vslideup.vx v8, v10, a0 ; NOVLDEP-NEXT: vmsne.vi v0, v8, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv16i1: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmerge.vim v10, v10, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m2, ta, ma ; VLDEP-NEXT: vmv.v.i v12, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v8, v12, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetvli zero, a0, e8, m2, ta, ma ; VLDEP-NEXT: vslidedown.vi v8, v8, 5 ; VLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; VLDEP-NEXT: vslideup.vx v8, v10, a0 ; VLDEP-NEXT: vmsne.vi v0, v8, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv16i1( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv16i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv16i1_negative_offset: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v10, 0 ; NOVLDEP-NEXT: vmerge.vim v10, v10, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m2, ta, ma ; NOVLDEP-NEXT: vmv.v.i v12, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v8, v12, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; NOVLDEP-NEXT: vslidedown.vx v8, v8, a0 ; NOVLDEP-NEXT: vslideup.vi v8, v10, 5 ; NOVLDEP-NEXT: vmsne.vi v0, v8, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv16i1_negative_offset: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v10, 0 ; VLDEP-NEXT: vmerge.vim v10, v10, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m2, ta, ma ; VLDEP-NEXT: vmv.v.i v12, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v8, v12, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetivli zero, 5, e8, m2, ta, ma ; VLDEP-NEXT: vslidedown.vx v8, v8, a0 ; VLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; VLDEP-NEXT: vslideup.vi v8, v10, 5 ; VLDEP-NEXT: vmsne.vi v0, v8, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv16i1( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv16i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv16i1_masked: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; NOVLDEP-NEXT: vmv1r.v v10, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v12, 0 ; NOVLDEP-NEXT: vmerge.vim v12, v12, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m2, ta, ma ; NOVLDEP-NEXT: vmv.v.i v14, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vmerge.vim v10, v14, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v10, v10, 5, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, m2, ta, mu ; NOVLDEP-NEXT: vslideup.vx v10, v12, a0, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, m2, ta, ma ; NOVLDEP-NEXT: vmsne.vi v8, v10, 0, v0.t ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv16i1_masked: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, ma ; VLDEP-NEXT: vmv1r.v v10, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v12, 0 ; VLDEP-NEXT: vmerge.vim v12, v12, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m2, ta, ma ; VLDEP-NEXT: vmv.v.i v14, 0 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vmerge.vim v10, v14, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli zero, a0, e8, m2, ta, ma ; VLDEP-NEXT: vslidedown.vi v10, v10, 5, v0.t ; VLDEP-NEXT: vsetvli zero, a1, e8, m2, ta, mu ; VLDEP-NEXT: vslideup.vx v10, v12, a0, v0.t ; VLDEP-NEXT: vsetvli zero, zero, e8, m2, ta, ma ; VLDEP-NEXT: vmsne.vi v8, v10, 0, v0.t ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv16i1( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv32i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv32i1: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v12, 0 ; NOVLDEP-NEXT: vmerge.vim v12, v12, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m4, ta, ma ; NOVLDEP-NEXT: vmv.v.i v16, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v8, v16, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v8, v8, 5 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vslideup.vx v8, v12, a0 ; NOVLDEP-NEXT: vmsne.vi v0, v8, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv32i1: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v12, 0 ; VLDEP-NEXT: vmerge.vim v12, v12, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m4, ta, ma ; VLDEP-NEXT: vmv.v.i v16, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v8, v16, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetvli zero, a0, e8, m4, ta, ma ; VLDEP-NEXT: vslidedown.vi v8, v8, 5 ; VLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; VLDEP-NEXT: vslideup.vx v8, v12, a0 ; VLDEP-NEXT: vmsne.vi v0, v8, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv32i1( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv32i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv32i1_negative_offset: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v12, 0 ; NOVLDEP-NEXT: vmerge.vim v12, v12, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m4, ta, ma ; NOVLDEP-NEXT: vmv.v.i v16, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v8, v16, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; NOVLDEP-NEXT: vslidedown.vx v8, v8, a0 ; NOVLDEP-NEXT: vslideup.vi v8, v12, 5 ; NOVLDEP-NEXT: vmsne.vi v0, v8, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv32i1_negative_offset: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v12, 0 ; VLDEP-NEXT: vmerge.vim v12, v12, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m4, ta, ma ; VLDEP-NEXT: vmv.v.i v16, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v8, v16, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetivli zero, 5, e8, m4, ta, ma ; VLDEP-NEXT: vslidedown.vx v8, v8, a0 ; VLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; VLDEP-NEXT: vslideup.vi v8, v12, 5 ; VLDEP-NEXT: vmsne.vi v0, v8, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv32i1( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv32i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv32i1_masked: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; NOVLDEP-NEXT: vmv1r.v v10, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v12, 0 ; NOVLDEP-NEXT: vmerge.vim v12, v12, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m4, ta, ma ; NOVLDEP-NEXT: vmv.v.i v16, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vmerge.vim v16, v16, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v16, v16, 5, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, m4, ta, mu ; NOVLDEP-NEXT: vslideup.vx v16, v12, a0, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, m4, ta, ma ; NOVLDEP-NEXT: vmsne.vi v8, v16, 0, v0.t ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv32i1_masked: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, ma ; VLDEP-NEXT: vmv1r.v v10, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v12, 0 ; VLDEP-NEXT: vmerge.vim v12, v12, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m4, ta, ma ; VLDEP-NEXT: vmv.v.i v16, 0 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vmerge.vim v16, v16, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli zero, a0, e8, m4, ta, ma ; VLDEP-NEXT: vslidedown.vi v16, v16, 5, v0.t ; VLDEP-NEXT: vsetvli zero, a1, e8, m4, ta, mu ; VLDEP-NEXT: vslideup.vx v16, v12, a0, v0.t ; VLDEP-NEXT: vsetvli zero, zero, e8, m4, ta, ma ; VLDEP-NEXT: vmsne.vi v8, v16, 0, v0.t ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv32i1( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv64i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv64i1: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v16, 0 ; NOVLDEP-NEXT: vmerge.vim v16, v16, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vmv.v.i v24, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v8, v24, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v8, v8, 5 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vslideup.vx v8, v16, a0 ; NOVLDEP-NEXT: vmsne.vi v0, v8, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv64i1: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v16, 0 ; VLDEP-NEXT: vmerge.vim v16, v16, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vmv.v.i v24, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v8, v24, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vslidedown.vi v8, v8, 5 ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vslideup.vx v8, v16, a0 ; VLDEP-NEXT: vmsne.vi v0, v8, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv64i1( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv64i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv64i1_negative_offset: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vmv1r.v v9, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v16, 0 ; NOVLDEP-NEXT: vmerge.vim v16, v16, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vmv.v.i v24, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vmerge.vim v8, v24, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vslidedown.vx v8, v8, a0 ; NOVLDEP-NEXT: vslideup.vi v8, v16, 5 ; NOVLDEP-NEXT: vmsne.vi v0, v8, 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv64i1_negative_offset: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vmv1r.v v9, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v16, 0 ; VLDEP-NEXT: vmerge.vim v16, v16, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vmv.v.i v24, 0 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vmerge.vim v8, v24, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vsetivli zero, 5, e8, m8, ta, ma ; VLDEP-NEXT: vslidedown.vx v8, v8, a0 ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vslideup.vi v8, v16, 5 ; VLDEP-NEXT: vmsne.vi v0, v8, 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv64i1( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv64i1_masked( %va, %vb, %mask, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv64i1_masked: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vmv1r.v v10, v0 ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vmv.v.i v16, 0 ; NOVLDEP-NEXT: vmerge.vim v16, v16, 1, v0 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vmv.v.i v24, 0 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vmerge.vim v24, v24, 1, v0 ; NOVLDEP-NEXT: addi a0, a0, -5 ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vslidedown.vi v24, v24, 5, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, m8, ta, mu ; NOVLDEP-NEXT: vslideup.vx v24, v16, a0, v0.t ; NOVLDEP-NEXT: vsetvli zero, zero, e8, m8, ta, ma ; NOVLDEP-NEXT: vmsne.vi v8, v24, 0, v0.t ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv64i1_masked: ; VLDEP: # %bb.0: ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vmv1r.v v10, v0 ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vmv.v.i v16, 0 ; VLDEP-NEXT: vmerge.vim v16, v16, 1, v0 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vmv.v.i v24, 0 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vmerge.vim v24, v24, 1, v0 ; VLDEP-NEXT: addi a0, a0, -5 ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vslidedown.vi v24, v24, 5, v0.t ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, mu ; VLDEP-NEXT: vslideup.vx v24, v16, a0, v0.t ; VLDEP-NEXT: vsetvli zero, zero, e8, m8, ta, ma ; VLDEP-NEXT: vmsne.vi v8, v24, 0, v0.t ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv64i1( %va, %vb, i32 5, %mask, i32 %evla, i32 %evlb) ret %v } ; nxv128i1 is split via the generic SplitVecRes_VP_SPLICE stack round-trip. The ; i1 elements must be widened to a byte type; otherwise getVectorElementPointer ; asserts and the negative-offset stride is 0. define @test_vp_splice_nxv128i1( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv128i1: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: csrr a2, vlenb ; NOVLDEP-NEXT: slli a4, a2, 4 ; NOVLDEP-NEXT: addi a4, a4, -1 ; NOVLDEP-NEXT: mv a5, a0 ; NOVLDEP-NEXT: mv a3, a0 ; NOVLDEP-NEXT: bltu a0, a4, .LBB21_2 ; NOVLDEP-NEXT: # %bb.1: ; NOVLDEP-NEXT: mv a3, a4 ; NOVLDEP-NEXT: .LBB21_2: ; NOVLDEP-NEXT: addi sp, sp, -80 ; NOVLDEP-NEXT: .cfi_def_cfa_offset 80 ; NOVLDEP-NEXT: sd ra, 72(sp) # 8-byte Folded Spill ; NOVLDEP-NEXT: sd s0, 64(sp) # 8-byte Folded Spill ; NOVLDEP-NEXT: .cfi_offset ra, -8 ; NOVLDEP-NEXT: .cfi_offset s0, -16 ; NOVLDEP-NEXT: addi s0, sp, 80 ; NOVLDEP-NEXT: .cfi_def_cfa s0, 0 ; NOVLDEP-NEXT: csrr a4, vlenb ; NOVLDEP-NEXT: slli a4, a4, 5 ; NOVLDEP-NEXT: sub sp, sp, a4 ; NOVLDEP-NEXT: andi sp, sp, -64 ; NOVLDEP-NEXT: addi a4, sp, 64 ; NOVLDEP-NEXT: vsetvli a6, zero, e8, m8, ta, ma ; NOVLDEP-NEXT: vmv.v.i v16, 0 ; NOVLDEP-NEXT: slli a2, a2, 3 ; NOVLDEP-NEXT: add a3, a4, a3 ; NOVLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; NOVLDEP-NEXT: bltu a5, a2, .LBB21_4 ; NOVLDEP-NEXT: # %bb.3: ; NOVLDEP-NEXT: mv a5, a2 ; NOVLDEP-NEXT: .LBB21_4: ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vsetvli zero, a5, e8, m8, ta, ma ; NOVLDEP-NEXT: vse8.v v24, (a4) ; NOVLDEP-NEXT: sub a5, a0, a2 ; NOVLDEP-NEXT: add a4, a4, a2 ; NOVLDEP-NEXT: sltu a0, a0, a5 ; NOVLDEP-NEXT: addi a0, a0, -1 ; NOVLDEP-NEXT: and a0, a0, a5 ; NOVLDEP-NEXT: sub a5, a1, a2 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; NOVLDEP-NEXT: vse8.v v24, (a4) ; NOVLDEP-NEXT: add a4, a3, a2 ; NOVLDEP-NEXT: sltu a0, a1, a5 ; NOVLDEP-NEXT: addi a0, a0, -1 ; NOVLDEP-NEXT: and a0, a0, a5 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; NOVLDEP-NEXT: vse8.v v24, (a4) ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli a4, zero, e8, m8, ta, ma ; NOVLDEP-NEXT: vmerge.vim v8, v16, 1, v0 ; NOVLDEP-NEXT: bltu a1, a2, .LBB21_6 ; NOVLDEP-NEXT: # %bb.5: ; NOVLDEP-NEXT: mv a1, a2 ; NOVLDEP-NEXT: .LBB21_6: ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vse8.v v8, (a3) ; NOVLDEP-NEXT: addi a3, sp, 69 ; NOVLDEP-NEXT: add a2, a3, a2 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vle8.v v8, (a2) ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vle8.v v16, (a3) ; NOVLDEP-NEXT: vsetvli a0, zero, e8, m8, ta, ma ; NOVLDEP-NEXT: vand.vi v24, v8, 1 ; NOVLDEP-NEXT: vmsne.vi v8, v24, 0 ; NOVLDEP-NEXT: vand.vi v16, v16, 1 ; NOVLDEP-NEXT: vmsne.vi v0, v16, 0 ; NOVLDEP-NEXT: addi sp, s0, -80 ; NOVLDEP-NEXT: .cfi_def_cfa sp, 80 ; NOVLDEP-NEXT: ld ra, 72(sp) # 8-byte Folded Reload ; NOVLDEP-NEXT: ld s0, 64(sp) # 8-byte Folded Reload ; NOVLDEP-NEXT: .cfi_restore ra ; NOVLDEP-NEXT: .cfi_restore s0 ; NOVLDEP-NEXT: addi sp, sp, 80 ; NOVLDEP-NEXT: .cfi_def_cfa_offset 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv128i1: ; VLDEP: # %bb.0: ; VLDEP-NEXT: csrr a2, vlenb ; VLDEP-NEXT: slli a4, a2, 4 ; VLDEP-NEXT: addi a4, a4, -1 ; VLDEP-NEXT: mv a5, a0 ; VLDEP-NEXT: mv a3, a0 ; VLDEP-NEXT: bltu a0, a4, .LBB21_2 ; VLDEP-NEXT: # %bb.1: ; VLDEP-NEXT: mv a3, a4 ; VLDEP-NEXT: .LBB21_2: ; VLDEP-NEXT: addi sp, sp, -80 ; VLDEP-NEXT: .cfi_def_cfa_offset 80 ; VLDEP-NEXT: sd ra, 72(sp) # 8-byte Folded Spill ; VLDEP-NEXT: sd s0, 64(sp) # 8-byte Folded Spill ; VLDEP-NEXT: .cfi_offset ra, -8 ; VLDEP-NEXT: .cfi_offset s0, -16 ; VLDEP-NEXT: addi s0, sp, 80 ; VLDEP-NEXT: .cfi_def_cfa s0, 0 ; VLDEP-NEXT: csrr a4, vlenb ; VLDEP-NEXT: slli a4, a4, 5 ; VLDEP-NEXT: sub sp, sp, a4 ; VLDEP-NEXT: andi sp, sp, -64 ; VLDEP-NEXT: addi a4, sp, 64 ; VLDEP-NEXT: vsetvli a6, zero, e8, m8, ta, ma ; VLDEP-NEXT: vmv.v.i v16, 0 ; VLDEP-NEXT: slli a2, a2, 3 ; VLDEP-NEXT: add a3, a4, a3 ; VLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; VLDEP-NEXT: bltu a5, a2, .LBB21_4 ; VLDEP-NEXT: # %bb.3: ; VLDEP-NEXT: mv a5, a2 ; VLDEP-NEXT: .LBB21_4: ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vsetvli zero, a5, e8, m8, ta, ma ; VLDEP-NEXT: vse8.v v24, (a4) ; VLDEP-NEXT: sub a5, a0, a2 ; VLDEP-NEXT: add a4, a4, a2 ; VLDEP-NEXT: sltu a0, a0, a5 ; VLDEP-NEXT: addi a0, a0, -1 ; VLDEP-NEXT: and a0, a0, a5 ; VLDEP-NEXT: sub a5, a1, a2 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; VLDEP-NEXT: vse8.v v24, (a4) ; VLDEP-NEXT: add a4, a3, a2 ; VLDEP-NEXT: sltu a0, a1, a5 ; VLDEP-NEXT: addi a0, a0, -1 ; VLDEP-NEXT: and a0, a0, a5 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; VLDEP-NEXT: vse8.v v24, (a4) ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli a4, zero, e8, m8, ta, ma ; VLDEP-NEXT: vmerge.vim v8, v16, 1, v0 ; VLDEP-NEXT: bltu a1, a2, .LBB21_6 ; VLDEP-NEXT: # %bb.5: ; VLDEP-NEXT: mv a1, a2 ; VLDEP-NEXT: .LBB21_6: ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vse8.v v8, (a3) ; VLDEP-NEXT: addi a3, sp, 69 ; VLDEP-NEXT: add a2, a3, a2 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vle8.v v8, (a2) ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vle8.v v16, (a3) ; VLDEP-NEXT: vsetvli a0, zero, e8, m8, ta, ma ; VLDEP-NEXT: vand.vi v24, v8, 1 ; VLDEP-NEXT: vmsne.vi v8, v24, 0 ; VLDEP-NEXT: vand.vi v16, v16, 1 ; VLDEP-NEXT: vmsne.vi v0, v16, 0 ; VLDEP-NEXT: addi sp, s0, -80 ; VLDEP-NEXT: .cfi_def_cfa sp, 80 ; VLDEP-NEXT: ld ra, 72(sp) # 8-byte Folded Reload ; VLDEP-NEXT: ld s0, 64(sp) # 8-byte Folded Reload ; VLDEP-NEXT: .cfi_restore ra ; VLDEP-NEXT: .cfi_restore s0 ; VLDEP-NEXT: addi sp, sp, 80 ; VLDEP-NEXT: .cfi_def_cfa_offset 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv128i1( %va, %vb, i32 5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } define @test_vp_splice_nxv128i1_negative_offset( %va, %vb, i32 zeroext %evla, i32 zeroext %evlb) #0 { ; NOVLDEP-LABEL: test_vp_splice_nxv128i1_negative_offset: ; NOVLDEP: # %bb.0: ; NOVLDEP-NEXT: csrr a3, vlenb ; NOVLDEP-NEXT: slli a4, a3, 4 ; NOVLDEP-NEXT: addi a4, a4, -1 ; NOVLDEP-NEXT: mv a6, a0 ; NOVLDEP-NEXT: mv a2, a0 ; NOVLDEP-NEXT: bltu a0, a4, .LBB22_2 ; NOVLDEP-NEXT: # %bb.1: ; NOVLDEP-NEXT: mv a2, a4 ; NOVLDEP-NEXT: .LBB22_2: ; NOVLDEP-NEXT: addi sp, sp, -80 ; NOVLDEP-NEXT: .cfi_def_cfa_offset 80 ; NOVLDEP-NEXT: sd ra, 72(sp) # 8-byte Folded Spill ; NOVLDEP-NEXT: sd s0, 64(sp) # 8-byte Folded Spill ; NOVLDEP-NEXT: .cfi_offset ra, -8 ; NOVLDEP-NEXT: .cfi_offset s0, -16 ; NOVLDEP-NEXT: addi s0, sp, 80 ; NOVLDEP-NEXT: .cfi_def_cfa s0, 0 ; NOVLDEP-NEXT: csrr a4, vlenb ; NOVLDEP-NEXT: slli a4, a4, 5 ; NOVLDEP-NEXT: sub sp, sp, a4 ; NOVLDEP-NEXT: andi sp, sp, -64 ; NOVLDEP-NEXT: addi a5, sp, 64 ; NOVLDEP-NEXT: vsetvli a4, zero, e8, m8, ta, ma ; NOVLDEP-NEXT: vmv.v.i v16, 0 ; NOVLDEP-NEXT: slli a3, a3, 3 ; NOVLDEP-NEXT: add a4, a5, a2 ; NOVLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; NOVLDEP-NEXT: bltu a6, a3, .LBB22_4 ; NOVLDEP-NEXT: # %bb.3: ; NOVLDEP-NEXT: mv a6, a3 ; NOVLDEP-NEXT: .LBB22_4: ; NOVLDEP-NEXT: vmv1r.v v0, v8 ; NOVLDEP-NEXT: vsetvli zero, a6, e8, m8, ta, ma ; NOVLDEP-NEXT: vse8.v v24, (a5) ; NOVLDEP-NEXT: sub a6, a0, a3 ; NOVLDEP-NEXT: add a5, a5, a3 ; NOVLDEP-NEXT: sltu a0, a0, a6 ; NOVLDEP-NEXT: addi a0, a0, -1 ; NOVLDEP-NEXT: and a0, a0, a6 ; NOVLDEP-NEXT: sub a6, a1, a3 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; NOVLDEP-NEXT: vse8.v v24, (a5) ; NOVLDEP-NEXT: add a5, a4, a3 ; NOVLDEP-NEXT: sltu a0, a1, a6 ; NOVLDEP-NEXT: addi a0, a0, -1 ; NOVLDEP-NEXT: and a0, a0, a6 ; NOVLDEP-NEXT: vmv1r.v v0, v10 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; NOVLDEP-NEXT: vse8.v v24, (a5) ; NOVLDEP-NEXT: vmv1r.v v0, v9 ; NOVLDEP-NEXT: vsetvli a5, zero, e8, m8, ta, ma ; NOVLDEP-NEXT: vmerge.vim v8, v16, 1, v0 ; NOVLDEP-NEXT: bltu a1, a3, .LBB22_6 ; NOVLDEP-NEXT: # %bb.5: ; NOVLDEP-NEXT: mv a1, a3 ; NOVLDEP-NEXT: .LBB22_6: ; NOVLDEP-NEXT: li a5, 5 ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vse8.v v8, (a4) ; NOVLDEP-NEXT: bltu a2, a5, .LBB22_8 ; NOVLDEP-NEXT: # %bb.7: ; NOVLDEP-NEXT: li a2, 5 ; NOVLDEP-NEXT: .LBB22_8: ; NOVLDEP-NEXT: sub a4, a4, a2 ; NOVLDEP-NEXT: add a3, a4, a3 ; NOVLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; NOVLDEP-NEXT: vle8.v v8, (a3) ; NOVLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; NOVLDEP-NEXT: vle8.v v16, (a4) ; NOVLDEP-NEXT: vsetvli a0, zero, e8, m8, ta, ma ; NOVLDEP-NEXT: vand.vi v24, v8, 1 ; NOVLDEP-NEXT: vmsne.vi v8, v24, 0 ; NOVLDEP-NEXT: vand.vi v16, v16, 1 ; NOVLDEP-NEXT: vmsne.vi v0, v16, 0 ; NOVLDEP-NEXT: addi sp, s0, -80 ; NOVLDEP-NEXT: .cfi_def_cfa sp, 80 ; NOVLDEP-NEXT: ld ra, 72(sp) # 8-byte Folded Reload ; NOVLDEP-NEXT: ld s0, 64(sp) # 8-byte Folded Reload ; NOVLDEP-NEXT: .cfi_restore ra ; NOVLDEP-NEXT: .cfi_restore s0 ; NOVLDEP-NEXT: addi sp, sp, 80 ; NOVLDEP-NEXT: .cfi_def_cfa_offset 0 ; NOVLDEP-NEXT: ret ; ; VLDEP-LABEL: test_vp_splice_nxv128i1_negative_offset: ; VLDEP: # %bb.0: ; VLDEP-NEXT: csrr a3, vlenb ; VLDEP-NEXT: slli a4, a3, 4 ; VLDEP-NEXT: addi a4, a4, -1 ; VLDEP-NEXT: mv a6, a0 ; VLDEP-NEXT: mv a2, a0 ; VLDEP-NEXT: bltu a0, a4, .LBB22_2 ; VLDEP-NEXT: # %bb.1: ; VLDEP-NEXT: mv a2, a4 ; VLDEP-NEXT: .LBB22_2: ; VLDEP-NEXT: addi sp, sp, -80 ; VLDEP-NEXT: .cfi_def_cfa_offset 80 ; VLDEP-NEXT: sd ra, 72(sp) # 8-byte Folded Spill ; VLDEP-NEXT: sd s0, 64(sp) # 8-byte Folded Spill ; VLDEP-NEXT: .cfi_offset ra, -8 ; VLDEP-NEXT: .cfi_offset s0, -16 ; VLDEP-NEXT: addi s0, sp, 80 ; VLDEP-NEXT: .cfi_def_cfa s0, 0 ; VLDEP-NEXT: csrr a4, vlenb ; VLDEP-NEXT: slli a4, a4, 5 ; VLDEP-NEXT: sub sp, sp, a4 ; VLDEP-NEXT: andi sp, sp, -64 ; VLDEP-NEXT: addi a5, sp, 64 ; VLDEP-NEXT: vsetvli a4, zero, e8, m8, ta, ma ; VLDEP-NEXT: vmv.v.i v16, 0 ; VLDEP-NEXT: slli a3, a3, 3 ; VLDEP-NEXT: add a4, a5, a2 ; VLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; VLDEP-NEXT: bltu a6, a3, .LBB22_4 ; VLDEP-NEXT: # %bb.3: ; VLDEP-NEXT: mv a6, a3 ; VLDEP-NEXT: .LBB22_4: ; VLDEP-NEXT: vmv1r.v v0, v8 ; VLDEP-NEXT: vsetvli zero, a6, e8, m8, ta, ma ; VLDEP-NEXT: vse8.v v24, (a5) ; VLDEP-NEXT: sub a6, a0, a3 ; VLDEP-NEXT: add a5, a5, a3 ; VLDEP-NEXT: sltu a0, a0, a6 ; VLDEP-NEXT: addi a0, a0, -1 ; VLDEP-NEXT: and a0, a0, a6 ; VLDEP-NEXT: sub a6, a1, a3 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; VLDEP-NEXT: vse8.v v24, (a5) ; VLDEP-NEXT: add a5, a4, a3 ; VLDEP-NEXT: sltu a0, a1, a6 ; VLDEP-NEXT: addi a0, a0, -1 ; VLDEP-NEXT: and a0, a0, a6 ; VLDEP-NEXT: vmv1r.v v0, v10 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vmerge.vim v24, v16, 1, v0 ; VLDEP-NEXT: vse8.v v24, (a5) ; VLDEP-NEXT: vmv1r.v v0, v9 ; VLDEP-NEXT: vsetvli a5, zero, e8, m8, ta, ma ; VLDEP-NEXT: vmerge.vim v8, v16, 1, v0 ; VLDEP-NEXT: bltu a1, a3, .LBB22_6 ; VLDEP-NEXT: # %bb.5: ; VLDEP-NEXT: mv a1, a3 ; VLDEP-NEXT: .LBB22_6: ; VLDEP-NEXT: li a5, 5 ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vse8.v v8, (a4) ; VLDEP-NEXT: bltu a2, a5, .LBB22_8 ; VLDEP-NEXT: # %bb.7: ; VLDEP-NEXT: li a2, 5 ; VLDEP-NEXT: .LBB22_8: ; VLDEP-NEXT: sub a4, a4, a2 ; VLDEP-NEXT: add a3, a4, a3 ; VLDEP-NEXT: vsetvli zero, a0, e8, m8, ta, ma ; VLDEP-NEXT: vle8.v v8, (a3) ; VLDEP-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; VLDEP-NEXT: vle8.v v16, (a4) ; VLDEP-NEXT: vsetvli a0, zero, e8, m8, ta, ma ; VLDEP-NEXT: vand.vi v24, v8, 1 ; VLDEP-NEXT: vmsne.vi v8, v24, 0 ; VLDEP-NEXT: vand.vi v16, v16, 1 ; VLDEP-NEXT: vmsne.vi v0, v16, 0 ; VLDEP-NEXT: addi sp, s0, -80 ; VLDEP-NEXT: .cfi_def_cfa sp, 80 ; VLDEP-NEXT: ld ra, 72(sp) # 8-byte Folded Reload ; VLDEP-NEXT: ld s0, 64(sp) # 8-byte Folded Reload ; VLDEP-NEXT: .cfi_restore ra ; VLDEP-NEXT: .cfi_restore s0 ; VLDEP-NEXT: addi sp, sp, 80 ; VLDEP-NEXT: .cfi_def_cfa_offset 0 ; VLDEP-NEXT: ret %v = call @llvm.experimental.vp.splice.nxv128i1( %va, %vb, i32 -5, splat (i1 1), i32 %evla, i32 %evlb) ret %v } attributes #0 = { vscale_range(2,0) }