diff --git a/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll @@ -890,3 +890,76 @@ %v = add %splat1, %splat2 ret %v } + +define @vadd_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vadd_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %vs = select %mask, %vb, zeroinitializer + %vc = add %va, %vs + ret %vc +} + +define @vadd_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vadd_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = add %va, %vs + ret %vc +} + +define @vadd_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vadd_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 7, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = add %va, %vs + ret %vc +} + +define @vadd_vv_mask_negative0_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vadd_vv_mask_negative0_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 1 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 1, i32 0 + %one = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %one + %vc = add %va, %vs + ret %vc +} + +define @vadd_vv_mask_negative1_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vadd_vv_mask_negative1_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %vs = select %mask, %vb, zeroinitializer + %vc = add %va, %vs + %vd = add %vc, %vs + ret %vd +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll @@ -1381,3 +1381,52 @@ %v = and %splat1, %splat2 ret %v } + +define @vand_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vand_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, -1 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 -1, i32 0 + %allones = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %allones + %vc = and %va, %vs + ret %vc +} + +define @vand_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vand_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, -1 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: ret + %head1 = insertelement poison, i32 -1, i32 0 + %allones = shufflevector %head1, poison, zeroinitializer + %head2 = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head2, poison, zeroinitializer + %vs = select %mask, %splat, %allones + %vc = and %va, %vs + ret %vc +} + +define @vand_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vand_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, -1 +; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 +; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: ret + %head1 = insertelement poison, i32 -1, i32 0 + %allones = shufflevector %head1, poison, zeroinitializer + %head2 = insertelement poison, i32 7, i32 0 + %splat = shufflevector %head2, poison, zeroinitializer + %vs = select %mask, %splat, %allones + %vc = and %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode.ll @@ -1184,3 +1184,52 @@ %vc = sdiv %va, %splat ret %vc } + +define @vdiv_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vdiv_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 1 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vdiv.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 1, i32 0 + %one = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %one + %vc = sdiv %va, %vs + ret %vc +} + +define @vdiv_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vdiv_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 1 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vdiv.vv v8, v8, v12 +; CHECK-NEXT: ret + %head1 = insertelement poison, i32 1, i32 0 + %one = shufflevector %head1, poison, zeroinitializer + %head2 = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head2, poison, zeroinitializer + %vs = select %mask, %splat, %one + %vc = sdiv %va, %vs + ret %vc +} + +define @vdiv_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vdiv_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 1 +; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 +; CHECK-NEXT: vdiv.vv v8, v8, v12 +; CHECK-NEXT: ret + %head1 = insertelement poison, i32 1, i32 0 + %one = shufflevector %head1, poison, zeroinitializer + %head2 = insertelement poison, i32 7, i32 0 + %splat = shufflevector %head2, poison, zeroinitializer + %vs = select %mask, %splat, %one + %vc = sdiv %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode.ll @@ -1197,3 +1197,52 @@ %vd = udiv %va, %vc ret %vd } + +define @vdivu_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vdivu_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 1 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vdivu.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 1, i32 0 + %one = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %one + %vc = udiv %va, %vs + ret %vc +} + +define @vdivu_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vdivu_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 1 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vdivu.vv v8, v8, v12 +; CHECK-NEXT: ret + %head1 = insertelement poison, i32 1, i32 0 + %one = shufflevector %head1, poison, zeroinitializer + %head2 = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head2, poison, zeroinitializer + %vs = select %mask, %splat, %one + %vc = udiv %va, %vs + ret %vc +} + +define @vdivu_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vdivu_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 1 +; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 +; CHECK-NEXT: vdivu.vv v8, v8, v12 +; CHECK-NEXT: ret + %head1 = insertelement poison, i32 1, i32 0 + %one = shufflevector %head1, poison, zeroinitializer + %head2 = insertelement poison, i32 7, i32 0 + %splat = shufflevector %head2, poison, zeroinitializer + %vs = select %mask, %splat, %one + %vc = udiv %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll @@ -369,3 +369,35 @@ %vc = fadd %splat, %va ret %vc } + +define @vfadd_vv_mask_nxv8f32( %va, %vb, %mask) { +; CHECK-LABEL: vfadd_vv_mask_nxv8f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vfadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, float 0.0, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %splat + %vc = fadd fast %va, %vs + ret %vc +} + +define @vfadd_vf_mask_nxv8f32( %va, float %b, %mask) { +; CHECK-LABEL: vfadd_vf_mask_nxv8f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vfmerge.vfm v12, v12, fa0, v0 +; CHECK-NEXT: vfadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head0 = insertelement poison, float 0.0, i32 0 + %splat0 = shufflevector %head0, poison, zeroinitializer + %head1 = insertelement poison, float %b, i32 0 + %splat1 = shufflevector %head1, poison, zeroinitializer + %vs = select %mask, %splat1, %splat0 + %vc = fadd fast %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vfdiv-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vfdiv-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfdiv-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfdiv-sdnode.ll @@ -369,3 +369,35 @@ %vc = fdiv %splat, %va ret %vc } + +define @vfdiv_vv_mask_nxv8f32( %va, %vb, %mask) { +; CHECK-LABEL: vfdiv_vv_mask_nxv8f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vfdiv.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, float 0.0, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %splat + %vc = fdiv %va, %vs + ret %vc +} + +define @vfdiv_vf_mask_nxv8f32( %va, float %b, %mask) { +; CHECK-LABEL: vfdiv_vf_mask_nxv8f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vfmerge.vfm v12, v12, fa0, v0 +; CHECK-NEXT: vfdiv.vv v8, v8, v12 +; CHECK-NEXT: ret + %head0 = insertelement poison, float 0.0, i32 0 + %splat0 = shufflevector %head0, poison, zeroinitializer + %head1 = insertelement poison, float %b, i32 0 + %splat1 = shufflevector %head1, poison, zeroinitializer + %vs = select %mask, %splat1, %splat0 + %vc = fdiv %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vfmul-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vfmul-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfmul-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfmul-sdnode.ll @@ -369,3 +369,35 @@ %vc = fmul %splat, %va ret %vc } + +define @vfmul_vv_mask_nxv8f32( %va, %vb, %mask) { +; CHECK-LABEL: vfmul_vv_mask_nxv8f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vfmul.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, float 0.0, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %splat + %vc = fmul %va, %vs + ret %vc +} + +define @vfmul_vf_mask_nxv8f32( %va, float %b, %mask) { +; CHECK-LABEL: vfmul_vf_mask_nxv8f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vfmerge.vfm v12, v12, fa0, v0 +; CHECK-NEXT: vfmul.vv v8, v8, v12 +; CHECK-NEXT: ret + %head0 = insertelement poison, float 0.0, i32 0 + %splat0 = shufflevector %head0, poison, zeroinitializer + %head1 = insertelement poison, float %b, i32 0 + %splat1 = shufflevector %head1, poison, zeroinitializer + %vs = select %mask, %splat1, %splat0 + %vc = fmul %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vfsub-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vfsub-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfsub-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfsub-sdnode.ll @@ -369,3 +369,35 @@ %vc = fsub %splat, %va ret %vc } + +define @vfsub_vv_mask_nxv8f32( %va, %vb, %mask) { +; CHECK-LABEL: vfsub_vv_mask_nxv8f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vfsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, float 0.0, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %splat + %vc = fsub fast %va, %vs + ret %vc +} + +define @vfsub_vf_mask_nxv8f32( %va, float %b, %mask) { +; CHECK-LABEL: vfsub_vf_mask_nxv8f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vfmerge.vfm v12, v12, fa0, v0 +; CHECK-NEXT: vfsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %head0 = insertelement poison, float 0.0, i32 0 + %splat0 = shufflevector %head0, poison, zeroinitializer + %head1 = insertelement poison, float %b, i32 0 + %splat1 = shufflevector %head1, poison, zeroinitializer + %vs = select %mask, %splat1, %splat0 + %vc = fsub fast %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vmaxu-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vmaxu-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vmaxu-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vmaxu-sdnode.ll @@ -890,3 +890,48 @@ ret %vc } +define @vmax_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vmax_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vmaxu.vv v8, v8, v12 +; CHECK-NEXT: ret + %vs = select %mask, %vb, zeroinitializer + %cmp = icmp ugt %va, %vs + %vc = select %cmp, %va, %vs + ret %vc +} + +define @vmax_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vmax_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vmaxu.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %cmp = icmp ugt %va, %vs + %vc = select %cmp, %va, %vs + ret %vc +} + +define @vmax_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vmax_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vim v12, v12, -3, v0 +; CHECK-NEXT: vmaxu.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 -3, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %cmp = icmp ugt %va, %vs + %vc = select %cmp, %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vminu-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vminu-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vminu-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vminu-sdnode.ll @@ -890,3 +890,54 @@ ret %vc } +define @vmin_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vmin_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, -1 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vminu.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 -1, i32 0 + %max = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %max + %cmp = icmp ult %va, %vs + %vc = select %cmp, %va, %vs + ret %vc +} + +define @vmin_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vmin_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, -1 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vminu.vv v8, v8, v12 +; CHECK-NEXT: ret + %head0 = insertelement poison, i32 -1, i32 0 + %max = shufflevector %head0, poison, zeroinitializer + %head1 = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head1, poison, zeroinitializer + %vs = select %mask, %splat, %max + %cmp = icmp ult %va, %vs + %vc = select %cmp, %va, %vs + ret %vc +} + +define @vmin_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vmin_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, -1 +; CHECK-NEXT: vmerge.vim v12, v12, -3, v0 +; CHECK-NEXT: vminu.vv v8, v8, v12 +; CHECK-NEXT: ret + %head0 = insertelement poison, i32 -1, i32 0 + %max = shufflevector %head0, poison, zeroinitializer + %head1 = insertelement poison, i32 -3, i32 0 + %splat = shufflevector %head1, poison, zeroinitializer + %vs = select %mask, %splat, %max + %cmp = icmp ult %va, %vs + %vc = select %cmp, %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll @@ -959,3 +959,53 @@ %v = mul %splat1, %splat2 ret %v } + +define @vmul_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vmul_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 1 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 1, i32 0 + %one = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %vb, %one + %vc = mul %va, %vs + ret %vc +} + +define @vmul_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vmul_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 1 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: ret + %head1 = insertelement poison, i32 1, i32 0 + %one = shufflevector %head1, poison, zeroinitializer + %head2 = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head2, poison, zeroinitializer + %vs = select %mask, %splat, %one + %vc = mul %va, %vs + ret %vc +} + +define @vmul_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vmul_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 1 +; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 +; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: ret + %head1 = insertelement poison, i32 1, i32 0 + %one = shufflevector %head1, poison, zeroinitializer + %head2 = insertelement poison, i32 7, i32 0 + %splat = shufflevector %head2, poison, zeroinitializer + %vs = select %mask, %splat, %one + %vc = mul %va, %vs + ret %vc +} + diff --git a/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll @@ -1174,3 +1174,46 @@ %v = or %splat1, %splat2 ret %v } + +define @vor_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vor_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: ret + %vs = select %mask, %vb, zeroinitializer + %vc = or %va, %vs + ret %vc +} + +define @vor_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vor_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = or %va, %vs + ret %vc +} + +define @vor_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vor_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 +; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 7, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = or %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll @@ -629,3 +629,47 @@ %vc = shl %va, %splat ret %vc } + +define @vshl_vv_mask_nxv4i32( %va, %vb, %mask) { +; CHECK-LABEL: vshl_vv_mask_nxv4i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: ret + %vs = select %mask, %vb, zeroinitializer + %vc = shl %va, %vs + ret %vc +} + +define @vshl_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vshl_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = shl %va, %vs + ret %vc +} + +define @vshl_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vshl_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: li a0, 31 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 31, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = shl %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll @@ -802,3 +802,46 @@ ret %vc } +define @vsra_vv_mask_nxv4i32( %va, %vb, %mask) { +; CHECK-LABEL: vsra_vv_mask_nxv4i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: ret + %vs = select %mask, %vb, zeroinitializer + %vc = ashr %va, %vs + ret %vc +} + +define @vsra_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vsra_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = ashr %va, %vs + ret %vc +} + +define @vsra_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vsra_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: li a0, 31 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 31, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = ashr %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll @@ -582,3 +582,46 @@ ret %vc } +define @vsrl_vv_mask_nxv4i32( %va, %vb, %mask) { +; CHECK-LABEL: vsrl_vv_mask_nxv4i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: ret + %vs = select %mask, %vb, zeroinitializer + %vc = lshr %va, %vs + ret %vc +} + +define @vsrl_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vsrl_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = lshr %va, %vs + ret %vc +} + +define @vsrl_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vsrl_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: li a0, 31 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 31, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = lshr %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll @@ -868,3 +868,47 @@ %v = sub %splat1, %splat2 ret %v } + +define @vsub_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vsub_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + + %vs = select %mask, %vb, zeroinitializer + %vc = sub %va, %vs + ret %vc +} + +define @vsub_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vsub_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = sub %va, %vs + ret %vc +} + +define @vsub_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vsub_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 7, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = sub %va, %vs + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll @@ -1381,3 +1381,46 @@ %v = xor %splat1, %splat2 ret %v } + +define @vxor_vv_mask_nxv8i32( %va, %vb, %mask) { +; CHECK-LABEL: vxor_vv_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v16, 0 +; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 +; CHECK-NEXT: vxor.vv v8, v8, v12 +; CHECK-NEXT: ret + %vs = select %mask, %vb, zeroinitializer + %vc = xor %va, %vs + ret %vc +} + +define @vxor_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { +; CHECK-LABEL: vxor_vx_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 +; CHECK-NEXT: vxor.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 %b, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = xor %va, %vs + ret %vc +} + +define @vxor_vi_mask_nxv8i32( %va, %mask) { +; CHECK-LABEL: vxor_vi_mask_nxv8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma +; CHECK-NEXT: vmv.v.i v12, 0 +; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 +; CHECK-NEXT: vxor.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i32 7, i32 0 + %splat = shufflevector %head, poison, zeroinitializer + %vs = select %mask, %splat, zeroinitializer + %vc = xor %va, %vs + ret %vc +}