xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Cuda.cpp (revision 13138422bc354a1ec35f53a27c4efeccdffc5639)
10b57cec5SDimitry Andric #include "clang/Basic/Cuda.h"
20b57cec5SDimitry Andric 
30b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
40b57cec5SDimitry Andric #include "llvm/ADT/StringSwitch.h"
5*13138422SDimitry Andric #include "llvm/ADT/Twine.h"
60b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h"
70b57cec5SDimitry Andric #include "llvm/Support/VersionTuple.h"
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric namespace clang {
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric const char *CudaVersionToString(CudaVersion V) {
120b57cec5SDimitry Andric   switch (V) {
130b57cec5SDimitry Andric   case CudaVersion::UNKNOWN:
140b57cec5SDimitry Andric     return "unknown";
150b57cec5SDimitry Andric   case CudaVersion::CUDA_70:
160b57cec5SDimitry Andric     return "7.0";
170b57cec5SDimitry Andric   case CudaVersion::CUDA_75:
180b57cec5SDimitry Andric     return "7.5";
190b57cec5SDimitry Andric   case CudaVersion::CUDA_80:
200b57cec5SDimitry Andric     return "8.0";
210b57cec5SDimitry Andric   case CudaVersion::CUDA_90:
220b57cec5SDimitry Andric     return "9.0";
230b57cec5SDimitry Andric   case CudaVersion::CUDA_91:
240b57cec5SDimitry Andric     return "9.1";
250b57cec5SDimitry Andric   case CudaVersion::CUDA_92:
260b57cec5SDimitry Andric     return "9.2";
270b57cec5SDimitry Andric   case CudaVersion::CUDA_100:
280b57cec5SDimitry Andric     return "10.0";
290b57cec5SDimitry Andric   case CudaVersion::CUDA_101:
300b57cec5SDimitry Andric     return "10.1";
310b57cec5SDimitry Andric   }
320b57cec5SDimitry Andric   llvm_unreachable("invalid enum");
330b57cec5SDimitry Andric }
340b57cec5SDimitry Andric 
35*13138422SDimitry Andric CudaVersion CudaStringToVersion(const llvm::Twine &S) {
36*13138422SDimitry Andric   return llvm::StringSwitch<CudaVersion>(S.str())
370b57cec5SDimitry Andric       .Case("7.0", CudaVersion::CUDA_70)
380b57cec5SDimitry Andric       .Case("7.5", CudaVersion::CUDA_75)
390b57cec5SDimitry Andric       .Case("8.0", CudaVersion::CUDA_80)
400b57cec5SDimitry Andric       .Case("9.0", CudaVersion::CUDA_90)
410b57cec5SDimitry Andric       .Case("9.1", CudaVersion::CUDA_91)
420b57cec5SDimitry Andric       .Case("9.2", CudaVersion::CUDA_92)
430b57cec5SDimitry Andric       .Case("10.0", CudaVersion::CUDA_100)
44*13138422SDimitry Andric       .Case("10.1", CudaVersion::CUDA_101)
45*13138422SDimitry Andric       .Default(CudaVersion::UNKNOWN);
460b57cec5SDimitry Andric }
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric const char *CudaArchToString(CudaArch A) {
490b57cec5SDimitry Andric   switch (A) {
500b57cec5SDimitry Andric   case CudaArch::LAST:
510b57cec5SDimitry Andric     break;
520b57cec5SDimitry Andric   case CudaArch::UNKNOWN:
530b57cec5SDimitry Andric     return "unknown";
540b57cec5SDimitry Andric   case CudaArch::SM_20:
550b57cec5SDimitry Andric     return "sm_20";
560b57cec5SDimitry Andric   case CudaArch::SM_21:
570b57cec5SDimitry Andric     return "sm_21";
580b57cec5SDimitry Andric   case CudaArch::SM_30:
590b57cec5SDimitry Andric     return "sm_30";
600b57cec5SDimitry Andric   case CudaArch::SM_32:
610b57cec5SDimitry Andric     return "sm_32";
620b57cec5SDimitry Andric   case CudaArch::SM_35:
630b57cec5SDimitry Andric     return "sm_35";
640b57cec5SDimitry Andric   case CudaArch::SM_37:
650b57cec5SDimitry Andric     return "sm_37";
660b57cec5SDimitry Andric   case CudaArch::SM_50:
670b57cec5SDimitry Andric     return "sm_50";
680b57cec5SDimitry Andric   case CudaArch::SM_52:
690b57cec5SDimitry Andric     return "sm_52";
700b57cec5SDimitry Andric   case CudaArch::SM_53:
710b57cec5SDimitry Andric     return "sm_53";
720b57cec5SDimitry Andric   case CudaArch::SM_60:
730b57cec5SDimitry Andric     return "sm_60";
740b57cec5SDimitry Andric   case CudaArch::SM_61:
750b57cec5SDimitry Andric     return "sm_61";
760b57cec5SDimitry Andric   case CudaArch::SM_62:
770b57cec5SDimitry Andric     return "sm_62";
780b57cec5SDimitry Andric   case CudaArch::SM_70:
790b57cec5SDimitry Andric     return "sm_70";
800b57cec5SDimitry Andric   case CudaArch::SM_72:
810b57cec5SDimitry Andric     return "sm_72";
820b57cec5SDimitry Andric   case CudaArch::SM_75:
830b57cec5SDimitry Andric     return "sm_75";
840b57cec5SDimitry Andric   case CudaArch::GFX600: // tahiti
850b57cec5SDimitry Andric     return "gfx600";
860b57cec5SDimitry Andric   case CudaArch::GFX601: // pitcairn, verde, oland,hainan
870b57cec5SDimitry Andric     return "gfx601";
880b57cec5SDimitry Andric   case CudaArch::GFX700: // kaveri
890b57cec5SDimitry Andric     return "gfx700";
900b57cec5SDimitry Andric   case CudaArch::GFX701: // hawaii
910b57cec5SDimitry Andric     return "gfx701";
920b57cec5SDimitry Andric   case CudaArch::GFX702: // 290,290x,R390,R390x
930b57cec5SDimitry Andric     return "gfx702";
940b57cec5SDimitry Andric   case CudaArch::GFX703: // kabini mullins
950b57cec5SDimitry Andric     return "gfx703";
960b57cec5SDimitry Andric   case CudaArch::GFX704: // bonaire
970b57cec5SDimitry Andric     return "gfx704";
980b57cec5SDimitry Andric   case CudaArch::GFX801: // carrizo
990b57cec5SDimitry Andric     return "gfx801";
1000b57cec5SDimitry Andric   case CudaArch::GFX802: // tonga,iceland
1010b57cec5SDimitry Andric     return "gfx802";
1020b57cec5SDimitry Andric   case CudaArch::GFX803: // fiji,polaris10
1030b57cec5SDimitry Andric     return "gfx803";
1040b57cec5SDimitry Andric   case CudaArch::GFX810: // stoney
1050b57cec5SDimitry Andric     return "gfx810";
1060b57cec5SDimitry Andric   case CudaArch::GFX900: // vega, instinct
1070b57cec5SDimitry Andric     return "gfx900";
1080b57cec5SDimitry Andric   case CudaArch::GFX902: // TBA
1090b57cec5SDimitry Andric     return "gfx902";
1100b57cec5SDimitry Andric   case CudaArch::GFX904: // TBA
1110b57cec5SDimitry Andric     return "gfx904";
1120b57cec5SDimitry Andric   case CudaArch::GFX906: // TBA
1130b57cec5SDimitry Andric     return "gfx906";
1140b57cec5SDimitry Andric   case CudaArch::GFX908: // TBA
1150b57cec5SDimitry Andric     return "gfx908";
1160b57cec5SDimitry Andric   case CudaArch::GFX909: // TBA
1170b57cec5SDimitry Andric     return "gfx909";
1180b57cec5SDimitry Andric   case CudaArch::GFX1010: // TBA
1190b57cec5SDimitry Andric     return "gfx1010";
1200b57cec5SDimitry Andric   case CudaArch::GFX1011: // TBA
1210b57cec5SDimitry Andric     return "gfx1011";
1220b57cec5SDimitry Andric   case CudaArch::GFX1012: // TBA
1230b57cec5SDimitry Andric     return "gfx1012";
1240b57cec5SDimitry Andric   }
1250b57cec5SDimitry Andric   llvm_unreachable("invalid enum");
1260b57cec5SDimitry Andric }
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric CudaArch StringToCudaArch(llvm::StringRef S) {
1290b57cec5SDimitry Andric   return llvm::StringSwitch<CudaArch>(S)
1300b57cec5SDimitry Andric       .Case("sm_20", CudaArch::SM_20)
1310b57cec5SDimitry Andric       .Case("sm_21", CudaArch::SM_21)
1320b57cec5SDimitry Andric       .Case("sm_30", CudaArch::SM_30)
1330b57cec5SDimitry Andric       .Case("sm_32", CudaArch::SM_32)
1340b57cec5SDimitry Andric       .Case("sm_35", CudaArch::SM_35)
1350b57cec5SDimitry Andric       .Case("sm_37", CudaArch::SM_37)
1360b57cec5SDimitry Andric       .Case("sm_50", CudaArch::SM_50)
1370b57cec5SDimitry Andric       .Case("sm_52", CudaArch::SM_52)
1380b57cec5SDimitry Andric       .Case("sm_53", CudaArch::SM_53)
1390b57cec5SDimitry Andric       .Case("sm_60", CudaArch::SM_60)
1400b57cec5SDimitry Andric       .Case("sm_61", CudaArch::SM_61)
1410b57cec5SDimitry Andric       .Case("sm_62", CudaArch::SM_62)
1420b57cec5SDimitry Andric       .Case("sm_70", CudaArch::SM_70)
1430b57cec5SDimitry Andric       .Case("sm_72", CudaArch::SM_72)
1440b57cec5SDimitry Andric       .Case("sm_75", CudaArch::SM_75)
1450b57cec5SDimitry Andric       .Case("gfx600", CudaArch::GFX600)
1460b57cec5SDimitry Andric       .Case("gfx601", CudaArch::GFX601)
1470b57cec5SDimitry Andric       .Case("gfx700", CudaArch::GFX700)
1480b57cec5SDimitry Andric       .Case("gfx701", CudaArch::GFX701)
1490b57cec5SDimitry Andric       .Case("gfx702", CudaArch::GFX702)
1500b57cec5SDimitry Andric       .Case("gfx703", CudaArch::GFX703)
1510b57cec5SDimitry Andric       .Case("gfx704", CudaArch::GFX704)
1520b57cec5SDimitry Andric       .Case("gfx801", CudaArch::GFX801)
1530b57cec5SDimitry Andric       .Case("gfx802", CudaArch::GFX802)
1540b57cec5SDimitry Andric       .Case("gfx803", CudaArch::GFX803)
1550b57cec5SDimitry Andric       .Case("gfx810", CudaArch::GFX810)
1560b57cec5SDimitry Andric       .Case("gfx900", CudaArch::GFX900)
1570b57cec5SDimitry Andric       .Case("gfx902", CudaArch::GFX902)
1580b57cec5SDimitry Andric       .Case("gfx904", CudaArch::GFX904)
1590b57cec5SDimitry Andric       .Case("gfx906", CudaArch::GFX906)
1600b57cec5SDimitry Andric       .Case("gfx908", CudaArch::GFX908)
1610b57cec5SDimitry Andric       .Case("gfx909", CudaArch::GFX909)
1620b57cec5SDimitry Andric       .Case("gfx1010", CudaArch::GFX1010)
1630b57cec5SDimitry Andric       .Case("gfx1011", CudaArch::GFX1011)
1640b57cec5SDimitry Andric       .Case("gfx1012", CudaArch::GFX1012)
1650b57cec5SDimitry Andric       .Default(CudaArch::UNKNOWN);
1660b57cec5SDimitry Andric }
1670b57cec5SDimitry Andric 
1680b57cec5SDimitry Andric const char *CudaVirtualArchToString(CudaVirtualArch A) {
1690b57cec5SDimitry Andric   switch (A) {
1700b57cec5SDimitry Andric   case CudaVirtualArch::UNKNOWN:
1710b57cec5SDimitry Andric     return "unknown";
1720b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_20:
1730b57cec5SDimitry Andric     return "compute_20";
1740b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_30:
1750b57cec5SDimitry Andric     return "compute_30";
1760b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_32:
1770b57cec5SDimitry Andric     return "compute_32";
1780b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_35:
1790b57cec5SDimitry Andric     return "compute_35";
1800b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_37:
1810b57cec5SDimitry Andric     return "compute_37";
1820b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_50:
1830b57cec5SDimitry Andric     return "compute_50";
1840b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_52:
1850b57cec5SDimitry Andric     return "compute_52";
1860b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_53:
1870b57cec5SDimitry Andric     return "compute_53";
1880b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_60:
1890b57cec5SDimitry Andric     return "compute_60";
1900b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_61:
1910b57cec5SDimitry Andric     return "compute_61";
1920b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_62:
1930b57cec5SDimitry Andric     return "compute_62";
1940b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_70:
1950b57cec5SDimitry Andric     return "compute_70";
1960b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_72:
1970b57cec5SDimitry Andric     return "compute_72";
1980b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_75:
1990b57cec5SDimitry Andric     return "compute_75";
2000b57cec5SDimitry Andric   case CudaVirtualArch::COMPUTE_AMDGCN:
2010b57cec5SDimitry Andric     return "compute_amdgcn";
2020b57cec5SDimitry Andric   }
2030b57cec5SDimitry Andric   llvm_unreachable("invalid enum");
2040b57cec5SDimitry Andric }
2050b57cec5SDimitry Andric 
2060b57cec5SDimitry Andric CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) {
2070b57cec5SDimitry Andric   return llvm::StringSwitch<CudaVirtualArch>(S)
2080b57cec5SDimitry Andric       .Case("compute_20", CudaVirtualArch::COMPUTE_20)
2090b57cec5SDimitry Andric       .Case("compute_30", CudaVirtualArch::COMPUTE_30)
2100b57cec5SDimitry Andric       .Case("compute_32", CudaVirtualArch::COMPUTE_32)
2110b57cec5SDimitry Andric       .Case("compute_35", CudaVirtualArch::COMPUTE_35)
2120b57cec5SDimitry Andric       .Case("compute_37", CudaVirtualArch::COMPUTE_37)
2130b57cec5SDimitry Andric       .Case("compute_50", CudaVirtualArch::COMPUTE_50)
2140b57cec5SDimitry Andric       .Case("compute_52", CudaVirtualArch::COMPUTE_52)
2150b57cec5SDimitry Andric       .Case("compute_53", CudaVirtualArch::COMPUTE_53)
2160b57cec5SDimitry Andric       .Case("compute_60", CudaVirtualArch::COMPUTE_60)
2170b57cec5SDimitry Andric       .Case("compute_61", CudaVirtualArch::COMPUTE_61)
2180b57cec5SDimitry Andric       .Case("compute_62", CudaVirtualArch::COMPUTE_62)
2190b57cec5SDimitry Andric       .Case("compute_70", CudaVirtualArch::COMPUTE_70)
2200b57cec5SDimitry Andric       .Case("compute_72", CudaVirtualArch::COMPUTE_72)
2210b57cec5SDimitry Andric       .Case("compute_75", CudaVirtualArch::COMPUTE_75)
2220b57cec5SDimitry Andric       .Case("compute_amdgcn", CudaVirtualArch::COMPUTE_AMDGCN)
2230b57cec5SDimitry Andric       .Default(CudaVirtualArch::UNKNOWN);
2240b57cec5SDimitry Andric }
2250b57cec5SDimitry Andric 
2260b57cec5SDimitry Andric CudaVirtualArch VirtualArchForCudaArch(CudaArch A) {
2270b57cec5SDimitry Andric   switch (A) {
2280b57cec5SDimitry Andric   case CudaArch::LAST:
2290b57cec5SDimitry Andric     break;
2300b57cec5SDimitry Andric   case CudaArch::UNKNOWN:
2310b57cec5SDimitry Andric     return CudaVirtualArch::UNKNOWN;
2320b57cec5SDimitry Andric   case CudaArch::SM_20:
2330b57cec5SDimitry Andric   case CudaArch::SM_21:
2340b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_20;
2350b57cec5SDimitry Andric   case CudaArch::SM_30:
2360b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_30;
2370b57cec5SDimitry Andric   case CudaArch::SM_32:
2380b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_32;
2390b57cec5SDimitry Andric   case CudaArch::SM_35:
2400b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_35;
2410b57cec5SDimitry Andric   case CudaArch::SM_37:
2420b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_37;
2430b57cec5SDimitry Andric   case CudaArch::SM_50:
2440b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_50;
2450b57cec5SDimitry Andric   case CudaArch::SM_52:
2460b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_52;
2470b57cec5SDimitry Andric   case CudaArch::SM_53:
2480b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_53;
2490b57cec5SDimitry Andric   case CudaArch::SM_60:
2500b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_60;
2510b57cec5SDimitry Andric   case CudaArch::SM_61:
2520b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_61;
2530b57cec5SDimitry Andric   case CudaArch::SM_62:
2540b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_62;
2550b57cec5SDimitry Andric   case CudaArch::SM_70:
2560b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_70;
2570b57cec5SDimitry Andric   case CudaArch::SM_72:
2580b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_72;
2590b57cec5SDimitry Andric   case CudaArch::SM_75:
2600b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_75;
2610b57cec5SDimitry Andric   case CudaArch::GFX600:
2620b57cec5SDimitry Andric   case CudaArch::GFX601:
2630b57cec5SDimitry Andric   case CudaArch::GFX700:
2640b57cec5SDimitry Andric   case CudaArch::GFX701:
2650b57cec5SDimitry Andric   case CudaArch::GFX702:
2660b57cec5SDimitry Andric   case CudaArch::GFX703:
2670b57cec5SDimitry Andric   case CudaArch::GFX704:
2680b57cec5SDimitry Andric   case CudaArch::GFX801:
2690b57cec5SDimitry Andric   case CudaArch::GFX802:
2700b57cec5SDimitry Andric   case CudaArch::GFX803:
2710b57cec5SDimitry Andric   case CudaArch::GFX810:
2720b57cec5SDimitry Andric   case CudaArch::GFX900:
2730b57cec5SDimitry Andric   case CudaArch::GFX902:
2740b57cec5SDimitry Andric   case CudaArch::GFX904:
2750b57cec5SDimitry Andric   case CudaArch::GFX906:
2760b57cec5SDimitry Andric   case CudaArch::GFX908:
2770b57cec5SDimitry Andric   case CudaArch::GFX909:
2780b57cec5SDimitry Andric   case CudaArch::GFX1010:
2790b57cec5SDimitry Andric   case CudaArch::GFX1011:
2800b57cec5SDimitry Andric   case CudaArch::GFX1012:
2810b57cec5SDimitry Andric     return CudaVirtualArch::COMPUTE_AMDGCN;
2820b57cec5SDimitry Andric   }
2830b57cec5SDimitry Andric   llvm_unreachable("invalid enum");
2840b57cec5SDimitry Andric }
2850b57cec5SDimitry Andric 
2860b57cec5SDimitry Andric CudaVersion MinVersionForCudaArch(CudaArch A) {
2870b57cec5SDimitry Andric   switch (A) {
2880b57cec5SDimitry Andric   case CudaArch::LAST:
2890b57cec5SDimitry Andric     break;
2900b57cec5SDimitry Andric   case CudaArch::UNKNOWN:
2910b57cec5SDimitry Andric     return CudaVersion::UNKNOWN;
2920b57cec5SDimitry Andric   case CudaArch::SM_20:
2930b57cec5SDimitry Andric   case CudaArch::SM_21:
2940b57cec5SDimitry Andric   case CudaArch::SM_30:
2950b57cec5SDimitry Andric   case CudaArch::SM_32:
2960b57cec5SDimitry Andric   case CudaArch::SM_35:
2970b57cec5SDimitry Andric   case CudaArch::SM_37:
2980b57cec5SDimitry Andric   case CudaArch::SM_50:
2990b57cec5SDimitry Andric   case CudaArch::SM_52:
3000b57cec5SDimitry Andric   case CudaArch::SM_53:
3010b57cec5SDimitry Andric     return CudaVersion::CUDA_70;
3020b57cec5SDimitry Andric   case CudaArch::SM_60:
3030b57cec5SDimitry Andric   case CudaArch::SM_61:
3040b57cec5SDimitry Andric   case CudaArch::SM_62:
3050b57cec5SDimitry Andric     return CudaVersion::CUDA_80;
3060b57cec5SDimitry Andric   case CudaArch::SM_70:
3070b57cec5SDimitry Andric     return CudaVersion::CUDA_90;
3080b57cec5SDimitry Andric   case CudaArch::SM_72:
3090b57cec5SDimitry Andric     return CudaVersion::CUDA_91;
3100b57cec5SDimitry Andric   case CudaArch::SM_75:
3110b57cec5SDimitry Andric     return CudaVersion::CUDA_100;
3120b57cec5SDimitry Andric   case CudaArch::GFX600:
3130b57cec5SDimitry Andric   case CudaArch::GFX601:
3140b57cec5SDimitry Andric   case CudaArch::GFX700:
3150b57cec5SDimitry Andric   case CudaArch::GFX701:
3160b57cec5SDimitry Andric   case CudaArch::GFX702:
3170b57cec5SDimitry Andric   case CudaArch::GFX703:
3180b57cec5SDimitry Andric   case CudaArch::GFX704:
3190b57cec5SDimitry Andric   case CudaArch::GFX801:
3200b57cec5SDimitry Andric   case CudaArch::GFX802:
3210b57cec5SDimitry Andric   case CudaArch::GFX803:
3220b57cec5SDimitry Andric   case CudaArch::GFX810:
3230b57cec5SDimitry Andric   case CudaArch::GFX900:
3240b57cec5SDimitry Andric   case CudaArch::GFX902:
3250b57cec5SDimitry Andric   case CudaArch::GFX904:
3260b57cec5SDimitry Andric   case CudaArch::GFX906:
3270b57cec5SDimitry Andric   case CudaArch::GFX908:
3280b57cec5SDimitry Andric   case CudaArch::GFX909:
3290b57cec5SDimitry Andric   case CudaArch::GFX1010:
3300b57cec5SDimitry Andric   case CudaArch::GFX1011:
3310b57cec5SDimitry Andric   case CudaArch::GFX1012:
3320b57cec5SDimitry Andric     return CudaVersion::CUDA_70;
3330b57cec5SDimitry Andric   }
3340b57cec5SDimitry Andric   llvm_unreachable("invalid enum");
3350b57cec5SDimitry Andric }
3360b57cec5SDimitry Andric 
3370b57cec5SDimitry Andric CudaVersion MaxVersionForCudaArch(CudaArch A) {
3380b57cec5SDimitry Andric   switch (A) {
3390b57cec5SDimitry Andric   case CudaArch::UNKNOWN:
3400b57cec5SDimitry Andric     return CudaVersion::UNKNOWN;
3410b57cec5SDimitry Andric   case CudaArch::SM_20:
3420b57cec5SDimitry Andric   case CudaArch::SM_21:
3430b57cec5SDimitry Andric   case CudaArch::GFX600:
3440b57cec5SDimitry Andric   case CudaArch::GFX601:
3450b57cec5SDimitry Andric   case CudaArch::GFX700:
3460b57cec5SDimitry Andric   case CudaArch::GFX701:
3470b57cec5SDimitry Andric   case CudaArch::GFX702:
3480b57cec5SDimitry Andric   case CudaArch::GFX703:
3490b57cec5SDimitry Andric   case CudaArch::GFX704:
3500b57cec5SDimitry Andric   case CudaArch::GFX801:
3510b57cec5SDimitry Andric   case CudaArch::GFX802:
3520b57cec5SDimitry Andric   case CudaArch::GFX803:
3530b57cec5SDimitry Andric   case CudaArch::GFX810:
3540b57cec5SDimitry Andric   case CudaArch::GFX900:
3550b57cec5SDimitry Andric   case CudaArch::GFX902:
3560b57cec5SDimitry Andric   case CudaArch::GFX1010:
3570b57cec5SDimitry Andric   case CudaArch::GFX1011:
3580b57cec5SDimitry Andric   case CudaArch::GFX1012:
3590b57cec5SDimitry Andric     return CudaVersion::CUDA_80;
3600b57cec5SDimitry Andric   default:
3610b57cec5SDimitry Andric     return CudaVersion::LATEST;
3620b57cec5SDimitry Andric   }
3630b57cec5SDimitry Andric }
3640b57cec5SDimitry Andric 
3650b57cec5SDimitry Andric static CudaVersion ToCudaVersion(llvm::VersionTuple Version) {
3660b57cec5SDimitry Andric   int IVer =
3670b57cec5SDimitry Andric       Version.getMajor() * 10 + Version.getMinor().getValueOr(0);
3680b57cec5SDimitry Andric   switch(IVer) {
3690b57cec5SDimitry Andric   case 70:
3700b57cec5SDimitry Andric     return CudaVersion::CUDA_70;
3710b57cec5SDimitry Andric   case 75:
3720b57cec5SDimitry Andric     return CudaVersion::CUDA_75;
3730b57cec5SDimitry Andric   case 80:
3740b57cec5SDimitry Andric     return CudaVersion::CUDA_80;
3750b57cec5SDimitry Andric   case 90:
3760b57cec5SDimitry Andric     return CudaVersion::CUDA_90;
3770b57cec5SDimitry Andric   case 91:
3780b57cec5SDimitry Andric     return CudaVersion::CUDA_91;
3790b57cec5SDimitry Andric   case 92:
3800b57cec5SDimitry Andric     return CudaVersion::CUDA_92;
3810b57cec5SDimitry Andric   case 100:
3820b57cec5SDimitry Andric     return CudaVersion::CUDA_100;
3830b57cec5SDimitry Andric   case 101:
3840b57cec5SDimitry Andric     return CudaVersion::CUDA_101;
3850b57cec5SDimitry Andric   default:
3860b57cec5SDimitry Andric     return CudaVersion::UNKNOWN;
3870b57cec5SDimitry Andric   }
3880b57cec5SDimitry Andric }
3890b57cec5SDimitry Andric 
3900b57cec5SDimitry Andric bool CudaFeatureEnabled(llvm::VersionTuple  Version, CudaFeature Feature) {
3910b57cec5SDimitry Andric   return CudaFeatureEnabled(ToCudaVersion(Version), Feature);
3920b57cec5SDimitry Andric }
3930b57cec5SDimitry Andric 
3940b57cec5SDimitry Andric bool CudaFeatureEnabled(CudaVersion Version, CudaFeature Feature) {
3950b57cec5SDimitry Andric   switch (Feature) {
3960b57cec5SDimitry Andric   case CudaFeature::CUDA_USES_NEW_LAUNCH:
3970b57cec5SDimitry Andric     return Version >= CudaVersion::CUDA_92;
3980b57cec5SDimitry Andric   case CudaFeature::CUDA_USES_FATBIN_REGISTER_END:
3990b57cec5SDimitry Andric     return Version >= CudaVersion::CUDA_101;
4000b57cec5SDimitry Andric   }
4010b57cec5SDimitry Andric   llvm_unreachable("Unknown CUDA feature.");
4020b57cec5SDimitry Andric }
4030b57cec5SDimitry Andric } // namespace clang
404