diff --git a/clang/include/clang/Basic/riscv_vector.td b/clang/include/clang/Basic/riscv_vector.td --- a/clang/include/clang/Basic/riscv_vector.td +++ b/clang/include/clang/Basic/riscv_vector.td @@ -186,7 +186,7 @@ // HasPolicyOperand: Has a policy operand. 0 is tail and mask undisturbed, 1 is // tail agnostic, 2 is mask undisturbed, and 3 is tail and mask agnostic. The // policy operand is located at the last position. - Policy MaskedPolicy = HasPolicyOperand; + Policy MaskedPolicyScheme = HasPolicyOperand; // The policy scheme for unmasked intrinsic IR. // It could be NonePolicy, HasPassthruOperand or HasPolicyOperand. @@ -194,7 +194,7 @@ // undef, tail policy is tail agnostic, otherwise policy is tail undisturbed. // HasPolicyOperand: Has a policy operand. 1 is tail agnostic and 0 is tail // undisturbed. - Policy UnMaskedPolicy = NonePolicy; + Policy UnMaskedPolicyScheme = NonePolicy; // This builtin supports non-masked function overloading api. // All masked operations support overloading api. @@ -443,7 +443,7 @@ let HasMaskedOffOperand = false; } -let UnMaskedPolicy = HasPolicyOperand, +let UnMaskedPolicyScheme = HasPolicyOperand, HasMaskedOffOperand = false in { multiclass RVVSlideBuiltinSet { defm "" : RVVOutBuiltinSetgetType()}; Ops[0] = Builder.CreateBitCast(Ops[0], ResultType->getPointerTo()); @@ -744,7 +744,7 @@ } let HasMaskedOffOperand = false, - MaskedPolicy = NonePolicy, + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ // Builtin: (ptr, value, vl). Intrinsic: (value, ptr, vl) std::swap(Ops[0], Ops[1]); @@ -781,7 +781,7 @@ IRName = "vsse", MaskedIRName = "vsse_mask", HasMaskedOffOperand = false, - MaskedPolicy = NonePolicy, + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ // Builtin: (ptr, stride, value, vl). Intrinsic: (value, ptr, stride, vl) std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3); @@ -805,7 +805,7 @@ multiclass RVVIndexedStore { let HasMaskedOffOperand = false, - MaskedPolicy = NonePolicy, + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ // Builtin: (ptr, index, value, vl). Intrinsic: (value, ptr, index, vl) std::rotate(Ops.begin(), Ops.begin() + 2, Ops.begin() + 3); @@ -1184,7 +1184,7 @@ MaskedIRName = op # nf # "_mask", NF = nf, HasMaskedOffOperand = false, - MaskedPolicy = NonePolicy, + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ { // Builtin: (ptr, val0, val1, ..., vl) @@ -1230,7 +1230,7 @@ MaskedIRName = op # nf # "_mask", NF = nf, HasMaskedOffOperand = false, - MaskedPolicy = NonePolicy, + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ { // Builtin: (ptr, stride, val0, val1, ..., vl). @@ -1272,7 +1272,7 @@ MaskedIRName = op # nf # "_mask", NF = nf, HasMaskedOffOperand = false, - MaskedPolicy = NonePolicy, + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ { // Builtin: (ptr, index, val0, val1, ..., vl) @@ -1561,7 +1561,7 @@ let HasBuiltinAlias = false, HasVL = false, HasMasked = false, - MaskedPolicy = NonePolicy, + MaskedPolicyScheme = NonePolicy, Log2LMUL = [0], ManualCodegen = [{IntrinsicTypes = {ResultType};}] in // Set XLEN type { @@ -1620,7 +1620,7 @@ // 12. Vector Integer Arithmetic Instructions // 12.1. Vector Single-Width Integer Add and Subtract -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { defm vadd : RVVIntBinBuiltinSet; defm vsub : RVVIntBinBuiltinSet; defm vrsub : RVVOutOp1BuiltinSet<"vrsub", "csil", @@ -1631,7 +1631,7 @@ // 12.2. Vector Widening Integer Add/Subtract // Widening unsigned integer add/subtract, 2*SEW = SEW +/- SEW -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { defm vwaddu : RVVUnsignedWidenBinBuiltinSet; defm vwsubu : RVVUnsignedWidenBinBuiltinSet; // Widening signed integer add/subtract, 2*SEW = SEW +/- SEW @@ -1650,7 +1650,7 @@ [["w", "wv"]]>; // 12.3. Vector Integer Extension -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { let Log2LMUL = [-3, -2, -1, 0, 1, 2] in { def vsext_vf2 : RVVIntExt<"vsext", "w", "wv", "csi">; def vzext_vf2 : RVVIntExt<"vzext", "Uw", "UwUv", "csi">; @@ -1666,8 +1666,8 @@ } // 12.4. Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions -let HasMasked = false, MaskedPolicy = NonePolicy in { - let UnMaskedPolicy = HasPassthruOperand in { +let HasMasked = false, MaskedPolicyScheme = NonePolicy in { + let UnMaskedPolicyScheme = HasPassthruOperand in { defm vadc : RVVCarryinBuiltinSet; defm vsbc : RVVCarryinBuiltinSet; } @@ -1678,7 +1678,7 @@ } // 12.5. Vector Bitwise Logical Instructions -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { defm vand : RVVIntBinBuiltinSet; defm vxor : RVVIntBinBuiltinSet; defm vor : RVVIntBinBuiltinSet; @@ -1686,7 +1686,7 @@ defm vnot_v : RVVPseudoVNotBuiltin<"vxor", "csil">; // 12.6. Vector Single-Width Bit Shift Instructions -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { defm vsll : RVVShiftBuiltinSet; defm vsrl : RVVUnsignedShiftBuiltinSet; defm vsra : RVVSignedShiftBuiltinSet; @@ -1700,7 +1700,7 @@ ["Uv", "UvUw"]]>; // 12.8. Vector Integer Comparison Instructions -let MaskedPolicy = NonePolicy in { +let MaskedPolicyScheme = NonePolicy in { defm vmseq : RVVIntMaskOutBuiltinSet; defm vmsne : RVVIntMaskOutBuiltinSet; defm vmsltu : RVVUnsignedMaskOutBuiltinSet; @@ -1714,7 +1714,7 @@ } // 12.9. Vector Integer Min/Max Instructions -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { defm vminu : RVVUnsignedBinBuiltinSet; defm vmin : RVVSignedBinBuiltinSet; defm vmaxu : RVVUnsignedBinBuiltinSet; @@ -1738,7 +1738,7 @@ } // 12.12. Vector Widening Integer Multiply Instructions -let Log2LMUL = [-3, -2, -1, 0, 1, 2], UnMaskedPolicy = HasPassthruOperand in { +let Log2LMUL = [-3, -2, -1, 0, 1, 2], UnMaskedPolicyScheme = HasPassthruOperand in { defm vwmul : RVVOutOp0Op1BuiltinSet<"vwmul", "csi", [["vv", "w", "wvv"], ["vx", "w", "wve"]]>; @@ -1751,7 +1751,7 @@ } // 12.13. Vector Single-Width Integer Multiply-Add Instructions -let UnMaskedPolicy = HasPolicyOperand in { +let UnMaskedPolicyScheme = HasPolicyOperand in { defm vmacc : RVVIntTerBuiltinSet; defm vnmsac : RVVIntTerBuiltinSet; defm vmadd : RVVIntTerBuiltinSet; @@ -1776,7 +1776,7 @@ // 12.15. Vector Integer Merge Instructions // C/C++ Operand: (mask, op1, op2, vl), Intrinsic: (op1, op2, mask, vl) -let HasMasked = false, MaskedPolicy = NonePolicy, +let HasMasked = false, MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.begin() + 3); IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[3]->getType()}; @@ -1791,7 +1791,9 @@ } // 12.16. Vector Integer Move Instructions -let HasMasked = false, UnMaskedPolicy = HasPassthruOperand, MaskedPolicy = NonePolicy in { +let HasMasked = false, + UnMaskedPolicyScheme = HasPassthruOperand, + MaskedPolicyScheme = NonePolicy in { let OverloadedName = "vmv_v" in { defm vmv_v : RVVOutBuiltinSet<"vmv_v_v", "csil", [["v", "Uv", "UvUv"]]>; @@ -1806,7 +1808,7 @@ // 13. Vector Fixed-Point Arithmetic Instructions // 13.1. Vector Single-Width Saturating Add and Subtract -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { defm vsaddu : RVVUnsignedBinBuiltinSet; defm vsadd : RVVSignedBinBuiltinSet; defm vssubu : RVVUnsignedBinBuiltinSet; @@ -1859,7 +1861,7 @@ } // 14.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions -let UnMaskedPolicy = HasPolicyOperand in { +let UnMaskedPolicyScheme = HasPolicyOperand in { defm vfmacc : RVVFloatingTerBuiltinSet; defm vfnmacc : RVVFloatingTerBuiltinSet; defm vfmsac : RVVFloatingTerBuiltinSet; @@ -1877,7 +1879,7 @@ } // 14.8. Vector Floating-Point Square-Root Instruction -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { def vfsqrt : RVVFloatingUnaryVVBuiltin; // 14.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction @@ -1899,7 +1901,7 @@ defm vfabs_v : RVVPseudoVFUnaryBuiltin<"vfsgnjx", "xfd">; // 14.13. Vector Floating-Point Compare Instructions -let MaskedPolicy = NonePolicy in { +let MaskedPolicyScheme = NonePolicy in { defm vmfeq : RVVFloatingMaskOutBuiltinSet; defm vmfne : RVVFloatingMaskOutBuiltinSet; defm vmflt : RVVFloatingMaskOutBuiltinSet; @@ -1909,12 +1911,12 @@ } // 14.14. Vector Floating-Point Classify Instruction -let Name = "vfclass_v", UnMaskedPolicy = HasPassthruOperand in +let Name = "vfclass_v", UnMaskedPolicyScheme = HasPassthruOperand in def vfclass : RVVOp0Builtin<"Uv", "Uvv", "xfd">; // 14.15. Vector Floating-Point Merge Instructio // C/C++ Operand: (mask, op1, op2, vl), Builtin: (op1, op2, mask, vl) -let HasMasked = false, MaskedPolicy = NonePolicy, +let HasMasked = false, MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.begin() + 3); IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[3]->getType()}; @@ -1928,13 +1930,13 @@ } // 14.16. Vector Floating-Point Move Instruction -let HasMasked = false, UnMaskedPolicy = HasPassthruOperand, - HasUnMaskedOverloaded = false, MaskedPolicy = NonePolicy in +let HasMasked = false, UnMaskedPolicyScheme = HasPassthruOperand, + HasUnMaskedOverloaded = false, MaskedPolicyScheme = NonePolicy in defm vfmv_v : RVVOutBuiltinSet<"vfmv_v_f", "xfd", [["f", "v", "ve"]]>; // 14.17. Single-Width Floating-Point/Integer Type-Convert Instructions -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { def vfcvt_xu_f_v : RVVConvToUnsignedBuiltin<"vfcvt_xu">; def vfcvt_x_f_v : RVVConvToSignedBuiltin<"vfcvt_x">; def vfcvt_rtz_xu_f_v : RVVConvToUnsignedBuiltin<"vfcvt_rtz_xu">; @@ -1968,7 +1970,7 @@ // 15. Vector Reduction Operations // 15.1. Vector Single-Width Integer Reduction Instructions -let MaskedPolicy = NonePolicy in { +let MaskedPolicyScheme = NonePolicy in { defm vredsum : RVVIntReductionBuiltinSet; defm vredmaxu : RVVUnsignedReductionBuiltin; defm vredmax : RVVSignedReductionBuiltin; @@ -2014,7 +2016,7 @@ defm vmmv_m : RVVPseudoMaskBuiltin<"vmand", "c">; defm vmnot_m : RVVPseudoMaskBuiltin<"vmnand", "c">; -let MaskedPolicy = NonePolicy in { +let MaskedPolicyScheme = NonePolicy in { // 16.2. Vector count population in mask vcpop.m def vcpop : RVVMaskOp0Builtin<"um">; @@ -2031,7 +2033,7 @@ def vmsof : RVVMaskUnaryBuiltin; } -let UnMaskedPolicy = HasPassthruOperand, HasUnMaskedOverloaded = false in { +let UnMaskedPolicyScheme = HasPassthruOperand, HasUnMaskedOverloaded = false in { // 16.8. Vector Iota Instruction defm viota : RVVOutBuiltinSet<"viota", "csil", [["m", "Uv", "Uvm"]]>; @@ -2042,7 +2044,7 @@ // 17. Vector Permutation Instructions // 17.1. Integer Scalar Move Instructions -let HasMasked = false, MaskedPolicy = NonePolicy in { +let HasMasked = false, MaskedPolicyScheme = NonePolicy in { let HasVL = false, OverloadedName = "vmv_x" in defm vmv_x : RVVOp0BuiltinSet<"vmv_x_s", "csil", [["s", "ve", "ev"], @@ -2054,7 +2056,7 @@ } // 17.2. Floating-Point Scalar Move Instructions -let HasMasked = false, MaskedPolicy = NonePolicy in { +let HasMasked = false, MaskedPolicyScheme = NonePolicy in { let HasVL = false, OverloadedName = "vfmv_f" in defm vfmv_f : RVVOp0BuiltinSet<"vfmv_f_s", "xfd", [["s", "ve", "ev"]]>; @@ -2071,7 +2073,7 @@ defm vslidedown : RVVSlideBuiltinSet; // 17.3.3. Vector Slide1up Instructions -let UnMaskedPolicy = HasPassthruOperand in { +let UnMaskedPolicyScheme = HasPassthruOperand in { defm vslide1up : RVVSlideOneBuiltinSet; defm vfslide1up : RVVFloatingBinVFBuiltinSet; @@ -2097,7 +2099,7 @@ } // 17.5. Vector Compress Instruction -let HasMasked = false, MaskedPolicy = NonePolicy, +let HasMasked = false, MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.begin() + 3); IntrinsicTypes = {ResultType, Ops[3]->getType()}; @@ -2112,7 +2114,7 @@ // Miscellaneous let HasMasked = false, HasVL = false, IRName = "" in { - let Name = "vreinterpret_v", MaskedPolicy = NonePolicy, + let Name = "vreinterpret_v", MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ return Builder.CreateBitCast(Ops[0], ResultType); }] in { @@ -2134,7 +2136,8 @@ } } - let Name = "vundefined", HasUnMaskedOverloaded = false, MaskedPolicy = NonePolicy, + let Name = "vundefined", HasUnMaskedOverloaded = false, + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ return llvm::UndefValue::get(ResultType); }] in { @@ -2144,7 +2147,8 @@ // LMUL truncation // C/C++ Operand: VecTy, IR Operand: VecTy, Index - let Name = "vlmul_trunc_v", OverloadedName = "vlmul_trunc", MaskedPolicy = NonePolicy, + let Name = "vlmul_trunc_v", OverloadedName = "vlmul_trunc", + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ { ID = Intrinsic::experimental_vector_extract; IntrinsicTypes = {ResultType, Ops[0]->getType()}; @@ -2162,7 +2166,8 @@ // LMUL extension // C/C++ Operand: SubVecTy, IR Operand: VecTy, SubVecTy, Index - let Name = "vlmul_ext_v", OverloadedName = "vlmul_ext", MaskedPolicy = NonePolicy, + let Name = "vlmul_ext_v", OverloadedName = "vlmul_ext", + MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ ID = Intrinsic::experimental_vector_insert; IntrinsicTypes = {ResultType, Ops[0]->getType()}; @@ -2180,7 +2185,7 @@ } } - let Name = "vget_v", MaskedPolicy = NonePolicy, + let Name = "vget_v", MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ { ID = Intrinsic::experimental_vector_extract; @@ -2203,7 +2208,7 @@ } } - let Name = "vset_v", Log2LMUL = [0, 1, 2], MaskedPolicy = NonePolicy, + let Name = "vset_v", Log2LMUL = [0, 1, 2], MaskedPolicyScheme = NonePolicy, ManualCodegen = [{ { ID = Intrinsic::experimental_vector_insert; diff --git a/clang/include/clang/Support/RISCVVIntrinsicUtils.h b/clang/include/clang/Support/RISCVVIntrinsicUtils.h --- a/clang/include/clang/Support/RISCVVIntrinsicUtils.h +++ b/clang/include/clang/Support/RISCVVIntrinsicUtils.h @@ -336,6 +336,11 @@ static std::string getSuffixStr(BasicType Type, int Log2LMUL, llvm::ArrayRef PrototypeDescriptors); + + static llvm::SmallVector + computeBuiltinTypes(llvm::ArrayRef Prototype, + bool IsMasked, bool HasMaskedOffOperand, bool HasVL, + unsigned NF); }; // RVVRequire should be sync with target features, but only diff --git a/clang/lib/Support/RISCVVIntrinsicUtils.cpp b/clang/lib/Support/RISCVVIntrinsicUtils.cpp --- a/clang/lib/Support/RISCVVIntrinsicUtils.cpp +++ b/clang/lib/Support/RISCVVIntrinsicUtils.cpp @@ -911,6 +911,48 @@ return join(SuffixStrs, "_"); } +llvm::SmallVector +RVVIntrinsic::computeBuiltinTypes(llvm::ArrayRef Prototype, + bool IsMasked, bool HasMaskedOffOperand, + bool HasVL, unsigned NF) { + SmallVector NewPrototype(Prototype.begin(), + Prototype.end()); + if (IsMasked) { + // If HasMaskedOffOperand, insert result type as first input operand. + if (HasMaskedOffOperand) { + if (NF == 1) { + NewPrototype.insert(NewPrototype.begin() + 1, NewPrototype[0]); + } else { + // Convert + // (void, op0 address, op1 address, ...) + // to + // (void, op0 address, op1 address, ..., maskedoff0, maskedoff1, ...) + PrototypeDescriptor MaskoffType = NewPrototype[1]; + MaskoffType.TM &= ~static_cast(TypeModifier::Pointer); + for (unsigned I = 0; I < NF; ++I) + NewPrototype.insert(NewPrototype.begin() + NF + 1, MaskoffType); + } + } + if (HasMaskedOffOperand && NF > 1) { + // Convert + // (void, op0 address, op1 address, ..., maskedoff0, maskedoff1, ...) + // to + // (void, op0 address, op1 address, ..., mask, maskedoff0, maskedoff1, + // ...) + NewPrototype.insert(NewPrototype.begin() + NF + 1, + PrototypeDescriptor::Mask); + } else { + // If IsMasked, insert PrototypeDescriptor:Mask as first input operand. + NewPrototype.insert(NewPrototype.begin() + 1, PrototypeDescriptor::Mask); + } + } + + // If HasVL, append PrototypeDescriptor:VL to last operand + if (HasVL) + NewPrototype.push_back(PrototypeDescriptor::VL); + return NewPrototype; +} + SmallVector parsePrototypes(StringRef Prototypes) { SmallVector PrototypeDescriptors; const StringRef Primaries("evwqom0ztul"); diff --git a/clang/utils/TableGen/RISCVVEmitter.cpp b/clang/utils/TableGen/RISCVVEmitter.cpp --- a/clang/utils/TableGen/RISCVVEmitter.cpp +++ b/clang/utils/TableGen/RISCVVEmitter.cpp @@ -375,12 +375,12 @@ bool HasMasked = R->getValueAsBit("HasMasked"); bool HasMaskedOffOperand = R->getValueAsBit("HasMaskedOffOperand"); bool HasVL = R->getValueAsBit("HasVL"); - Record *MaskedPolicyRecord = R->getValueAsDef("MaskedPolicy"); - PolicyScheme MaskedPolicy = - static_cast(MaskedPolicyRecord->getValueAsInt("Value")); - Record *UnMaskedPolicyRecord = R->getValueAsDef("UnMaskedPolicy"); - PolicyScheme UnMaskedPolicy = - static_cast(UnMaskedPolicyRecord->getValueAsInt("Value")); + Record *MPSRecord = R->getValueAsDef("MaskedPolicyScheme"); + auto MaskedPolicyScheme = + static_cast(MPSRecord->getValueAsInt("Value")); + Record *UMPSRecord = R->getValueAsDef("UnMaskedPolicyScheme"); + auto UnMaskedPolicyScheme = + static_cast(UMPSRecord->getValueAsInt("Value")); bool HasUnMaskedOverloaded = R->getValueAsBit("HasUnMaskedOverloaded"); std::vector Log2LMULList = R->getValueAsListOfInts("Log2LMUL"); bool HasBuiltinAlias = R->getValueAsBit("HasBuiltinAlias"); @@ -396,50 +396,19 @@ // Parse prototype and create a list of primitive type with transformers // (operand) in Prototype. Prototype[0] is output operand. - SmallVector Prototype = parsePrototypes(Prototypes); + SmallVector BasicPrototype = + parsePrototypes(Prototypes); SmallVector SuffixDesc = parsePrototypes(SuffixProto); SmallVector OverloadedSuffixDesc = parsePrototypes(OverloadedSuffixProto); // Compute Builtin types - SmallVector MaskedPrototype = Prototype; - if (HasMasked) { - // If HasMaskedOffOperand, insert result type as first input operand. - if (HasMaskedOffOperand) { - if (NF == 1) { - MaskedPrototype.insert(MaskedPrototype.begin() + 1, Prototype[0]); - } else { - // Convert - // (void, op0 address, op1 address, ...) - // to - // (void, op0 address, op1 address, ..., maskedoff0, maskedoff1, ...) - PrototypeDescriptor MaskoffType = Prototype[1]; - MaskoffType.TM &= ~static_cast(TypeModifier::Pointer); - for (unsigned I = 0; I < NF; ++I) - MaskedPrototype.insert(MaskedPrototype.begin() + NF + 1, - MaskoffType); - } - } - if (HasMaskedOffOperand && NF > 1) { - // Convert - // (void, op0 address, op1 address, ..., maskedoff0, maskedoff1, ...) - // to - // (void, op0 address, op1 address, ..., mask, maskedoff0, maskedoff1, - // ...) - MaskedPrototype.insert(MaskedPrototype.begin() + NF + 1, - PrototypeDescriptor::Mask); - } else { - // If HasMasked, insert PrototypeDescriptor:Mask as first input operand. - MaskedPrototype.insert(MaskedPrototype.begin() + 1, - PrototypeDescriptor::Mask); - } - } - // If HasVL, append PrototypeDescriptor:VL to last operand - if (HasVL) { - Prototype.push_back(PrototypeDescriptor::VL); - MaskedPrototype.push_back(PrototypeDescriptor::VL); - } + auto Prototype = RVVIntrinsic::computeBuiltinTypes( + BasicPrototype, /*IsMasked=*/false, /*HasMaskedOffOperand=*/false, + HasVL, NF); + auto MaskedPrototype = RVVIntrinsic::computeBuiltinTypes( + BasicPrototype, /*IsMasked=*/true, HasMaskedOffOperand, HasVL, NF); // Create Intrinsics for each type and LMUL. for (char I : TypeRange) { @@ -458,7 +427,7 @@ Out.push_back(std::make_unique( Name, SuffixStr, OverloadedName, OverloadedSuffixStr, IRName, /*IsMasked=*/false, /*HasMaskedOffOperand=*/false, HasVL, - UnMaskedPolicy, HasUnMaskedOverloaded, HasBuiltinAlias, + UnMaskedPolicyScheme, HasUnMaskedOverloaded, HasBuiltinAlias, ManualCodegen, Types.getValue(), IntrinsicTypes, RequiredFeatures, NF)); if (HasMasked) { @@ -468,7 +437,7 @@ Out.push_back(std::make_unique( Name, SuffixStr, OverloadedName, OverloadedSuffixStr, MaskedIRName, - /*IsMasked=*/true, HasMaskedOffOperand, HasVL, MaskedPolicy, + /*IsMasked=*/true, HasMaskedOffOperand, HasVL, MaskedPolicyScheme, HasUnMaskedOverloaded, HasBuiltinAlias, MaskedManualCodegen, MaskTypes.getValue(), IntrinsicTypes, RequiredFeatures, NF)); }