================
@@ -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) 
{
+  if (A == B || A == Triple::NoSubArch || B == Triple::NoSubArch)
+    return true;
+
+  Triple::SubArchType MajorA = AMDGPU::getMajorSubArch(A);
+  Triple::SubArchType MajorB = AMDGPU::getMajorSubArch(B);
+
+  // One side is the major-family subarch covering the other's family.
+  if (A == MajorA)
+    return MajorA == MajorB;
+  if (B == MajorB)
+    return MajorA == MajorB;
+
+  return false;
+}
+
+bool AMDGPU::isCPUValidForSubArch(Triple::SubArchType SubArch, GPUKind AK) {
+  // An unrecognized GPU is never valid.
+  if (AK == GK_NONE)
+    return false;
+  // A legacy triple without a subarch accepts any known GPU.
+  if (SubArch == Triple::NoSubArch)
+    return true;
+  return isSubArchCompatible(getSubArch(AK), SubArch);
+}
+
+bool AMDGPU::isCPUValidForSubArch(Triple::SubArchType SubArch, StringRef CPU) {
+  return isCPUValidForSubArch(SubArch, parseArchAMDGCN(CPU));
+}
+
+bool AMDGPU::isSubArchCompatible(const Triple &A, const Triple &B) {
+  // Tolerate subarch mismatch if one entry is none. This is a hack for bitcode
+  // libraries.
+  // There's a missing enum entry for an unknown subarch. Make sure the
+  // subarch is really empty.
+  if (A.getSubArch() == Triple::NoSubArch)
+    return A.getArchName().size() == 6;
+
+  if (B.getSubArch() == Triple::NoSubArch)
+    return B.getArchName().size() == 6;
+
+  return isSubArchCompatible(A.getSubArch(), B.getSubArch());
+}
+
+std::string AMDGPU::mergeSubArch(const Triple &A, const Triple &B) {
+  if (A.getSubArch() == Triple::NoSubArch)
+    return B.str();
+  if (B.getSubArch() == Triple::NoSubArch)
+    return A.str();
+
+  Triple::SubArchType MajorA = AMDGPU::getMajorSubArch(A.getSubArch());
+  Triple::SubArchType MajorB = AMDGPU::getMajorSubArch(B.getSubArch());
+
+  // With a compatible major arch, return the specific subarch.
+  if (A.getSubArch() == MajorA) {
+    if (MajorA == MajorB)
+      return B.str();
+  }
+
+  if (B.getSubArch() == MajorB) {
+    if (MajorA == MajorB)
+      return A.str();
+  }
+
+  // Invalid case.
----------------
slinder1 wrote:

Why is the invalid case just defaulting to `B`?

https://github.com/llvm/llvm-project/pull/206480
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to