diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -566,10 +566,11 @@ !subst("_B64", "", !subst("_MASK", "", !subst("_COMMUTABLE", "", + !subst("_TIED", "", !subst("F16", "F", !subst("F32", "F", !subst("F64", "F", - !subst("Pseudo", "", PseudoInst)))))))))))))))))))); + !subst("Pseudo", "", PseudoInst))))))))))))))))))))); } // The destination vector register group for a masked vector instruction cannot @@ -964,6 +965,27 @@ let BaseInstr = !cast(PseudoToVInst.VInst); } +// Special version of VPseudoBinaryMask where we pretend the first source is +// tied to the destination so we can workaround the earlyclobber constraint. +// This allows maskedoff and rs2 to be the same register. +class VPseudoTiedBinaryMask : + Pseudo<(outs GetVRegNoV0.R:$rd), + (ins GetVRegNoV0.R:$merge, + Op2Class:$rs1, + VMaskOp:$vm, GPR:$vl, ixlenimm:$sew), []>, + RISCVVPseudo { + let mayLoad = 0; + let mayStore = 0; + let hasSideEffects = 0; + let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; + let HasVLOp = 1; + let HasSEWOp = 1; + let HasMergeOp = 0; // Merge is also rs2. + let BaseInstr = !cast(PseudoToVInst.VInst); +} + class VPseudoBinaryCarryIn { + let VLMul = MInfo.value in { + def "_" # MInfo.MX # "_MASK_TIED" : VPseudoTiedBinaryMask; + } +} + multiclass VPseudoBinaryV_VV { foreach m = MxList.m in defm _VV : VPseudoBinary; @@ -1543,9 +1575,12 @@ } multiclass VPseudoBinaryW_WV { - foreach m = MxList.m[0-5] in + foreach m = MxList.m[0-5] in { defm _WV : VPseudoBinary; + defm _WV : VPseudoTiedBinary; + } } multiclass VPseudoBinaryW_WX { @@ -2233,6 +2268,25 @@ (op2_type op2_kind:$rs2), (mask_type V0), GPR:$vl, sew)>; +class VPatTiedBinaryMask : + Pat<(result_type (!cast(intrinsic_name#"_mask") + (result_type result_reg_class:$merge), + (result_type result_reg_class:$merge), + (op2_type op2_kind:$rs2), + (mask_type V0), + (XLenVT (VLOp GPR:$vl)))), + (!cast(inst#"_MASK_TIED") + (result_type result_reg_class:$merge), + (op2_type op2_kind:$rs2), + (mask_type V0), GPR:$vl, sew)>; + class VPatTernaryNoMask; defm : VPatBinary %a } + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv1f32_nxv1f32_nxv1f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv1f32_nxv1f32_nxv1f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv1f32.nxv1f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv2f32_nxv2f32_nxv2f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv2f32_nxv2f32_nxv2f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv2f32.nxv2f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv4f32_nxv4f32_nxv4f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv4f32_nxv4f32_nxv4f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv4f32.nxv4f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv8f32_nxv8f32_nxv8f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv8f32_nxv8f32_nxv8f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv8f32.nxv8f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv16f32_nxv16f32_nxv16f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv16f32_nxv16f32_nxv16f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv16f32.nxv16f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv1f64_nxv1f64_nxv1f32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv1f64_nxv1f64_nxv1f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv1f64.nxv1f32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv2f64_nxv2f64_nxv2f32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv2f64_nxv2f64_nxv2f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv2f64.nxv2f32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv4f64_nxv4f64_nxv4f32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv4f64_nxv4f64_nxv4f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv4f64.nxv4f32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv8f64_nxv8f64_nxv8f32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv8f64_nxv8f64_nxv8f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv8f64.nxv8f32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vfwadd.w-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vfwadd.w-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfwadd.w-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfwadd.w-rv64.ll @@ -821,3 +821,156 @@ ret %a } + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv1f32_nxv1f32_nxv1f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv1f32_nxv1f32_nxv1f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv1f32.nxv1f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv2f32_nxv2f32_nxv2f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv2f32_nxv2f32_nxv2f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv2f32.nxv2f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv4f32_nxv4f32_nxv4f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv4f32_nxv4f32_nxv4f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv4f32.nxv4f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv8f32_nxv8f32_nxv8f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv8f32_nxv8f32_nxv8f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv8f32.nxv8f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv16f32_nxv16f32_nxv16f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv16f32_nxv16f32_nxv16f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv16f32.nxv16f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv1f64_nxv1f64_nxv1f32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv1f64_nxv1f64_nxv1f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv1f64.nxv1f32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv2f64_nxv2f64_nxv2f32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv2f64_nxv2f64_nxv2f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv2f64.nxv2f32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv4f64_nxv4f64_nxv4f32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv4f64_nxv4f64_nxv4f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv4f64.nxv4f32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwadd.w_mask_wv_tie_nxv8f64_nxv8f64_nxv8f32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwadd.w_mask_wv_tie_nxv8f64_nxv8f64_nxv8f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vfwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwadd.w.mask.nxv8f64.nxv8f32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vfwsub.w-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vfwsub.w-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfwsub.w-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfwsub.w-rv32.ll @@ -821,3 +821,156 @@ ret %a } + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv1f32_nxv1f32_nxv1f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv1f32_nxv1f32_nxv1f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv1f32.nxv1f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv2f32_nxv2f32_nxv2f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv2f32_nxv2f32_nxv2f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv2f32.nxv2f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv4f32_nxv4f32_nxv4f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv4f32_nxv4f32_nxv4f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv4f32.nxv4f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv8f32_nxv8f32_nxv8f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv8f32_nxv8f32_nxv8f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv8f32.nxv8f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv16f32_nxv16f32_nxv16f16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv16f32_nxv16f32_nxv16f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv16f32.nxv16f16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv1f64_nxv1f64_nxv1f32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv1f64_nxv1f64_nxv1f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv1f64.nxv1f32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv2f64_nxv2f64_nxv2f32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv2f64_nxv2f64_nxv2f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv2f64.nxv2f32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv4f64_nxv4f64_nxv4f32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv4f64_nxv4f64_nxv4f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv4f64.nxv4f32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv8f64_nxv8f64_nxv8f32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv8f64_nxv8f64_nxv8f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv8f64.nxv8f32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vfwsub.w-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vfwsub.w-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfwsub.w-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfwsub.w-rv64.ll @@ -821,3 +821,156 @@ ret %a } + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv1f32_nxv1f32_nxv1f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv1f32_nxv1f32_nxv1f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv1f32.nxv1f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv2f32_nxv2f32_nxv2f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv2f32_nxv2f32_nxv2f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv2f32.nxv2f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv4f32_nxv4f32_nxv4f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv4f32_nxv4f32_nxv4f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv4f32.nxv4f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv8f32_nxv8f32_nxv8f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv8f32_nxv8f32_nxv8f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv8f32.nxv8f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv16f32_nxv16f32_nxv16f16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv16f32_nxv16f32_nxv16f16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv16f32.nxv16f16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv1f64_nxv1f64_nxv1f32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv1f64_nxv1f64_nxv1f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv1f64.nxv1f32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv2f64_nxv2f64_nxv2f32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv2f64_nxv2f64_nxv2f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv2f64.nxv2f32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv4f64_nxv4f64_nxv4f32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv4f64_nxv4f64_nxv4f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv4f64.nxv4f32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vfwsub.w_mask_wv_tie_nxv8f64_nxv8f64_nxv8f32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vfwsub.w_mask_wv_tie_nxv8f64_nxv8f64_nxv8f32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vfwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vfwsub.w.mask.nxv8f64.nxv8f32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwadd.w-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vwadd.w-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vwadd.w-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwadd.w-rv32.ll @@ -1338,3 +1338,258 @@ ret %a } + +define @intrinsic_vwadd.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf8,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv1i16.nxv1i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv2i16.nxv2i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv4i16.nxv4i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m1,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv8i16.nxv8i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv16i16.nxv16i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv32i16.nxv32i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv1i32.nxv1i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv2i32.nxv2i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv4i32.nxv4i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv8i32.nxv8i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv16i32.nxv16i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv1i64.nxv1i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv2i64.nxv2i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv4i64.nxv4i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv8i64.nxv8i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwadd.w-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vwadd.w-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vwadd.w-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwadd.w-rv64.ll @@ -1338,3 +1338,258 @@ ret %a } + +define @intrinsic_vwadd.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf8,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv1i16.nxv1i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv2i16.nxv2i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv4i16.nxv4i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m1,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv8i16.nxv8i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv16i16.nxv16i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv32i16.nxv32i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv1i32.nxv1i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv2i32.nxv2i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv4i32.nxv4i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv8i32.nxv8i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv16i32.nxv16i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv1i64.nxv1i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv2i64.nxv2i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv4i64.nxv4i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwadd.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwadd.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vwadd.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwadd.w.mask.nxv8i64.nxv8i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwaddu.w-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vwaddu.w-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vwaddu.w-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwaddu.w-rv32.ll @@ -1338,3 +1338,258 @@ ret %a } + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf8,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv1i16.nxv1i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv2i16.nxv2i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv4i16.nxv4i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m1,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv8i16.nxv8i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv16i16.nxv16i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv32i16.nxv32i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv1i32.nxv1i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv2i32.nxv2i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv4i32.nxv4i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv8i32.nxv8i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv16i32.nxv16i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv1i64.nxv1i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv2i64.nxv2i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv4i64.nxv4i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv8i64.nxv8i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwaddu.w-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vwaddu.w-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vwaddu.w-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwaddu.w-rv64.ll @@ -1338,3 +1338,258 @@ ret %a } + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf8,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv1i16.nxv1i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv2i16.nxv2i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv4i16.nxv4i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m1,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv8i16.nxv8i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv16i16.nxv16i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv32i16.nxv32i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv1i32.nxv1i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv2i32.nxv2i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv4i32.nxv4i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv8i32.nxv8i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv16i32.nxv16i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv1i64.nxv1i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv2i64.nxv2i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv4i64.nxv4i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwaddu.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwaddu.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vwaddu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwaddu.w.mask.nxv8i64.nxv8i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwsub.w-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vwsub.w-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vwsub.w-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwsub.w-rv32.ll @@ -1338,3 +1338,258 @@ ret %a } + +define @intrinsic_vwsub.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf8,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv1i16.nxv1i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv2i16.nxv2i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv4i16.nxv4i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m1,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv8i16.nxv8i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv16i16.nxv16i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv32i16.nxv32i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv1i32.nxv1i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv2i32.nxv2i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv4i32.nxv4i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv8i32.nxv8i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv16i32.nxv16i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv1i64.nxv1i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv2i64.nxv2i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv4i64.nxv4i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv8i64.nxv8i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwsub.w-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vwsub.w-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vwsub.w-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwsub.w-rv64.ll @@ -1338,3 +1338,258 @@ ret %a } + +define @intrinsic_vwsub.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf8,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv1i16.nxv1i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv2i16.nxv2i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv4i16.nxv4i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m1,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv8i16.nxv8i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv16i16.nxv16i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv32i16.nxv32i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv1i32.nxv1i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv2i32.nxv2i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv4i32.nxv4i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv8i32.nxv8i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv16i32.nxv16i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv1i64.nxv1i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv2i64.nxv2i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv4i64.nxv4i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsub.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsub.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vwsub.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsub.w.mask.nxv8i64.nxv8i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwsubu.w-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vwsubu.w-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vwsubu.w-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwsubu.w-rv32.ll @@ -1338,3 +1338,258 @@ ret %a } + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf8,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv1i16.nxv1i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv2i16.nxv2i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv4i16.nxv4i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m1,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv8i16.nxv8i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv16i16.nxv16i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv32i16.nxv32i8( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv1i32.nxv1i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv2i32.nxv2i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv4i32.nxv4i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv8i32.nxv8i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv16i32.nxv16i16( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv1i64.nxv1i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv2i64.nxv2i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv4i64.nxv4i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv8i64.nxv8i32( + %0, + %0, + %1, + %2, + i32 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwsubu.w-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vwsubu.w-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vwsubu.w-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwsubu.w-rv64.ll @@ -1338,3 +1338,258 @@ ret %a } + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv1i16_nxv1i16_nxv1i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf8,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv1i16.nxv1i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv2i16_nxv2i16_nxv2i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv2i16.nxv2i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv4i16_nxv4i16_nxv4i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,mf2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv4i16.nxv4i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv8i16_nxv8i16_nxv8i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m1,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv8i16.nxv8i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv16i16_nxv16i16_nxv16i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv16i16.nxv16i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv32i16_nxv32i16_nxv32i8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e8,m4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv32i16.nxv32i8( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv1i32_nxv1i32_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv1i32.nxv1i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv2i32_nxv2i32_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,mf2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv2i32.nxv2i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv4i32_nxv4i32_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m1,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv4i32.nxv4i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv8i32_nxv8i32_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv8i32.nxv8i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv16i32_nxv16i32_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e16,m4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv16i32.nxv16i16( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv1i64_nxv1i64_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,mf2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v9, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv1i64.nxv1i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv2i64_nxv2i64_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m1,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v10, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv2i64.nxv2i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv4i64_nxv4i64_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m2,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v12, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv4i64.nxv4i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +} + +define @intrinsic_vwsubu.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vwsubu.w_mask_wv_tie_nxv8i64_nxv8i64_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli zero, a0, e32,m4,tu,mu +; CHECK-NEXT: vwsubu.wv v8, v8, v16, v0.t +; CHECK-NEXT: ret +entry: + %a = call @llvm.riscv.vwsubu.w.mask.nxv8i64.nxv8i32( + %0, + %0, + %1, + %2, + i64 %3) + + ret %a +}