diff options
author | Piyou Chen <piyou.chen@sifive.com> | 2022-12-20 01:12:57 -0800 |
---|---|---|
committer | Piyou Chen <piyou.chen@sifive.com> | 2022-12-20 01:13:13 -0800 |
commit | 0d4c6506100b339311283c10d841d7693287666a (patch) | |
tree | 5943cdb2c3224efccd6edd1d19151827b03c9c21 /clang/utils | |
parent | 74cca964a653190d37101116c80d38907228021a (diff) | |
download | llvm-0d4c6506100b339311283c10d841d7693287666a.tar.gz |
[RISCV] Refactor RVV Policy by structure
RVV intrinsic function has several policy variants.
Include TU, TA, TAMU, TAMA, TUMU, TUMA, MU, MA, TUM, TAM
Currently, the clang side enumerates these policies, but it's hard to add a new policy.
This patch use structure to replace the origin policy enumeration, and enhance some policy transform logic.
This is a clean-up job that will not affect the RVV intrinsic functionality and make sure riscv_vector_builtin_cg.inc is the same as the original one.
Reviewed By: kito-cheng
Differential Revision: https://reviews.llvm.org/D139995
Diffstat (limited to 'clang/utils')
-rw-r--r-- | clang/utils/TableGen/RISCVVEmitter.cpp | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/clang/utils/TableGen/RISCVVEmitter.cpp b/clang/utils/TableGen/RISCVVEmitter.cpp index 1b58b7d02d37..ecf3b35e4a47 100644 --- a/clang/utils/TableGen/RISCVVEmitter.cpp +++ b/clang/utils/TableGen/RISCVVEmitter.cpp @@ -164,8 +164,8 @@ void emitCodeGenSwitchBody(const RVVIntrinsic *RVVI, raw_ostream &OS) { if (RVVI->getNF() >= 2) OS << " NF = " + utostr(RVVI->getNF()) + ";\n"; // We had initialized DefaultPolicy as TU/TUMU in CodeGen function. - if (RVVI->getDefaultPolicy() != Policy::TU && - RVVI->getDefaultPolicy() != Policy::TUMU && !RVVI->hasPassthruOperand() && + if (!RVVI->getDefaultPolicy().isTUPolicy() && + !RVVI->getDefaultPolicy().isTUMUPolicy() && !RVVI->hasPassthruOperand() && !RVVI->hasManualCodegen() && RVVI->hasVL()) OS << " DefaultPolicy = " << RVVI->getDefaultPolicyBits() << ";\n"; @@ -193,11 +193,11 @@ void emitCodeGenSwitchBody(const RVVIntrinsic *RVVI, raw_ostream &OS) { OS << " Ops.push_back(ConstantInt::get(Ops.back()->getType()," " DefaultPolicy));\n"; if (RVVI->hasMaskedOffOperand() && - RVVI->getDefaultPolicy() == Policy::TAMA) + RVVI->getDefaultPolicy().isTAMAPolicy()) OS << " Ops.insert(Ops.begin(), llvm::UndefValue::get(ResultType));\n"; // Masked reduction cases. if (!RVVI->hasMaskedOffOperand() && RVVI->hasPassthruOperand() && - RVVI->getDefaultPolicy() == Policy::TAMA) + RVVI->getDefaultPolicy().isTAMAPolicy()) OS << " Ops.insert(Ops.begin(), llvm::UndefValue::get(ResultType));\n"; } else { OS << " std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());\n"; @@ -207,7 +207,7 @@ void emitCodeGenSwitchBody(const RVVIntrinsic *RVVI, raw_ostream &OS) { OS << " Ops.push_back(ConstantInt::get(Ops.back()->getType(), " "DefaultPolicy));\n"; else if (RVVI->hasPassthruOperand() && - RVVI->getDefaultPolicy() == Policy::TA) + RVVI->getDefaultPolicy().isTAPolicy()) OS << " Ops.insert(Ops.begin(), llvm::UndefValue::get(ResultType));\n"; } @@ -527,7 +527,11 @@ void RVVEmitter::createRVVIntrinsics( unsigned NF = R->getValueAsInt("NF"); // If unmasked builtin supports policy, they should be TU or TA. - SmallVector<Policy> SupportedUnMaskedPolicies = {Policy::TU, Policy::TA}; + llvm::SmallVector<Policy> SupportedUnMaskedPolicies; + SupportedUnMaskedPolicies.emplace_back(Policy( + Policy::PolicyType::Undisturbed, Policy::PolicyType::Omit)); // TU + SupportedUnMaskedPolicies.emplace_back( + Policy(Policy::PolicyType::Agnostic, Policy::PolicyType::Omit)); // TA SmallVector<Policy> SupportedMaskedPolicies = RVVIntrinsic::getSupportedMaskedPolicies(HasTailPolicy, HasMaskPolicy); @@ -544,10 +548,10 @@ void RVVEmitter::createRVVIntrinsics( auto Prototype = RVVIntrinsic::computeBuiltinTypes( BasicPrototype, /*IsMasked=*/false, /*HasMaskedOffOperand=*/false, HasVL, NF, IsPrototypeDefaultTU, - UnMaskedPolicyScheme); + UnMaskedPolicyScheme, Policy()); auto MaskedPrototype = RVVIntrinsic::computeBuiltinTypes( BasicPrototype, /*IsMasked=*/true, HasMaskedOffOperand, HasVL, NF, - IsPrototypeDefaultTU, MaskedPolicyScheme); + IsPrototypeDefaultTU, MaskedPolicyScheme, Policy()); // Create Intrinsics for each type and LMUL. for (char I : TypeRange) { @@ -569,7 +573,7 @@ void RVVEmitter::createRVVIntrinsics( /*IsMasked=*/false, /*HasMaskedOffOperand=*/false, HasVL, UnMaskedPolicyScheme, SupportOverloading, HasBuiltinAlias, ManualCodegen, *Types, IntrinsicTypes, RequiredFeatures, NF, - Policy::PolicyNone, IsPrototypeDefaultTU)); + Policy(), IsPrototypeDefaultTU)); if (UnMaskedPolicyScheme != PolicyScheme::SchemeNone) for (auto P : SupportedUnMaskedPolicies) { SmallVector<PrototypeDescriptor> PolicyPrototype = @@ -596,7 +600,7 @@ void RVVEmitter::createRVVIntrinsics( /*IsMasked=*/true, HasMaskedOffOperand, HasVL, MaskedPolicyScheme, SupportOverloading, HasBuiltinAlias, MaskedManualCodegen, *MaskTypes, IntrinsicTypes, RequiredFeatures, NF, - Policy::PolicyNone, IsPrototypeDefaultTU)); + Policy(), IsPrototypeDefaultTU)); if (MaskedPolicyScheme == PolicyScheme::SchemeNone) continue; for (auto P : SupportedMaskedPolicies) { |