================
@@ -34,9 +34,159 @@ StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK)
{
return ArchName.empty() ? "" : ArchName.drop_back(2);
}
+Triple::SubArchType llvm::AMDGPU::getSubArch(GPUKind AK) {
+ switch (AK) {
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)
\
+ case ENUM:
\
+ return SUBARCH;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ default:
+ return Triple::SubArchType::NoSubArch;
+ }
+}
+
+AMDGPU::GPUKind
+llvm::AMDGPU::getGPUKindFromSubArch(Triple::SubArchType SubArch) {
+ switch (SubArch) {
+#define AMDGCN_GPU(NAME, ENUM, SUBARCH, ISAVERSION, FEATURES)
\
+ case SUBARCH:
\
+ return ENUM;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ default:
+ return GK_NONE;
+ }
+}
+
+static const Triple::SubArchType
+ AMDGPUMajorFamilies[Triple::LastAMDGPUSubArch - Triple::FirstAMDGPUSubArch
+
+ 1] = {
+ Triple::AMDGPUSubArch6, Triple::AMDGPUSubArch6,
+ Triple::AMDGPUSubArch6, Triple::AMDGPUSubArch6,
+
+ Triple::AMDGPUSubArch7, Triple::AMDGPUSubArch7,
+ Triple::AMDGPUSubArch7, Triple::AMDGPUSubArch7,
+ Triple::AMDGPUSubArch7, Triple::AMDGPUSubArch7,
+ Triple::AMDGPUSubArch7,
+
+ Triple::AMDGPUSubArch8, Triple::AMDGPUSubArch8,
+ Triple::AMDGPUSubArch8, Triple::AMDGPUSubArch8,
+ Triple::AMDGPUSubArch8,
+
+ Triple::AMDGPUSubArch810,
+
+ Triple::AMDGPUSubArch9, Triple::AMDGPUSubArch9,
+ Triple::AMDGPUSubArch9, Triple::AMDGPUSubArch9,
+ Triple::AMDGPUSubArch9, Triple::AMDGPUSubArch9,
+ Triple::AMDGPUSubArch9,
+
+ Triple::AMDGPUSubArch908, Triple::AMDGPUSubArch90A,
+
+ Triple::AMDGPUSubArch9_4, Triple::AMDGPUSubArch9_4,
+ Triple::AMDGPUSubArch9_4,
+
+ Triple::AMDGPUSubArch10_1, Triple::AMDGPUSubArch10_1,
+ Triple::AMDGPUSubArch10_1, Triple::AMDGPUSubArch10_1,
+ Triple::AMDGPUSubArch10_1,
+
+ Triple::AMDGPUSubArch10_3, Triple::AMDGPUSubArch10_3,
+ Triple::AMDGPUSubArch10_3, Triple::AMDGPUSubArch10_3,
+ Triple::AMDGPUSubArch10_3, Triple::AMDGPUSubArch10_3,
+ Triple::AMDGPUSubArch10_3, Triple::AMDGPUSubArch10_3,
+
+ Triple::AMDGPUSubArch11, Triple::AMDGPUSubArch11,
+ Triple::AMDGPUSubArch11, Triple::AMDGPUSubArch11,
+ Triple::AMDGPUSubArch11, Triple::AMDGPUSubArch11,
+ Triple::AMDGPUSubArch11, Triple::AMDGPUSubArch11,
+ Triple::AMDGPUSubArch11, Triple::AMDGPUSubArch11,
+
+ Triple::AMDGPUSubArch11_7, Triple::AMDGPUSubArch11_7,
+ Triple::AMDGPUSubArch11_7, Triple::AMDGPUSubArch11_7,
+
+ Triple::AMDGPUSubArch12, Triple::AMDGPUSubArch12,
+ Triple::AMDGPUSubArch12,
+
+ Triple::AMDGPUSubArch12_5, Triple::AMDGPUSubArch12_5,
+ Triple::AMDGPUSubArch12_5,
+
+ Triple::AMDGPUSubArch13, Triple::AMDGPUSubArch13};
+
+Triple::SubArchType AMDGPU::getMajorSubArch(Triple::SubArchType X) {
+ if (X < Triple::FirstAMDGPUSubArch || X > Triple::LastAMDGPUSubArch)
+ return Triple::NoSubArch;
+ return AMDGPUMajorFamilies[X - Triple::FirstAMDGPUSubArch];
+}
+
+bool AMDGPU::isSubArchCompatible(Triple::SubArchType A, Triple::SubArchType B)
{
----------------
slinder1 wrote:
Multiple of these functions implement the same logic, with just a few
particulars substituted in. It would be clearer if there was one place the
merge is done and the others are based on it, e.g. (likely with a bunch of
mistakes, can probably make things static, etc.)
```c++
enum class MergeSubArchResult {
A,
B,
Incompatible,
}
MergeSubArchResult AMDGPU::mergeSubArch(Triple::SubArchType A,
Triple::SubArchType B) {
if (A == Triple::NoSubArch)
return MergeSubArchResult::B;
if (B == Triple::NoSubArch)
return MergeSubArchResult::A;
Triple::SubArchType MajorA = AMDGPU::getMajorSubArch(A);
Triple::SubArchType MajorB = AMDGPU::getMajorSubArch(B);
if (MajorA != MajorB)
return MergeSubArchResult::Incompatible;
// With a compatible major arch, return the specific subarch.
if (A == MajorA)
return MergeSubArchResult::B;
return MergeSubArchResult::A;
}
bool AMDGPU::isSubArchCompatible(Triple::SubArchType A, Triple::SubArchType B) {
return mergeSubArch(A, B) != MergeSubArchResult::Incompatible;
}
std::string AMDGPU::mergeSubArch(const Triple &A, const Triple &B) {
switch (mergeSubArch(A.getSubArch(), B.getSubArch()) {
case MergeSubArchResult::A: return A.str();
case MergeSubArchResult::B: return B.str();
case MergeSubArchResult::Incompatible: return B.str(); // ?
}
}
```
https://github.com/llvm/llvm-project/pull/206480
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits