Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -1472,8 +1472,46 @@ class R600TargetInfo : public TargetInfo { static const Builtin::Info BuiltinInfo[]; - /// \brief The GPU profiles supported by the R600 target. + /// \brief The specific GPU types supported by the R600 target. enum GPUKind { + GPU_NONE = 0, + GPU_R600, + GPU_RV610, + GPU_RV620, + GPU_RV630, + GPU_RV635, + GPU_RS780, + GPU_RS880, + GPU_RV670, + GPU_RV710, + GPU_RV730, + GPU_RV740, + GPU_RV770, // XXX - 790? + GPU_PALM, + GPU_CEDAR, + GPU_SUMO, + GPU_SUMO2, + GPU_REDWOOD, + GPU_JUNIPER, + GPU_HEMLOCK, + GPU_CYPRESS, + GPU_BARTS, + GPU_TURKS, + GPU_CAICOS, + GPU_CAYMAN, + GPU_ARUBA, + GPU_TAHITI, + GPU_PITCAIRN, + GPU_VERDE, + GPU_OLAND, + GPU_BONAIRE, + GPU_KABINI, + GPU_KAVERI, + GPU_HAWAII + } GPU; + + /// \brief The GPU profiles supported by the R600 target. + enum GPUGenerationKind { GK_NONE, GK_R600, GK_R600_DOUBLE_OPS, @@ -1485,17 +1523,135 @@ GK_CAYMAN, GK_SOUTHERN_ISLANDS, GK_SEA_ISLANDS - } GPU; + } GPUGeneration; + + static GPUGenerationKind getGenKind(GPUKind GPU) { + switch (GPU) { + case GPU_R600: + case GPU_RV610: + case GPU_RV620: + case GPU_RV630: + case GPU_RV635: + case GPU_RS780: + case GPU_RS880: + return GK_R600; + case GPU_RV670: + return GK_R600_DOUBLE_OPS; + case GPU_RV710: + case GPU_RV730: + return GK_R700; + case GPU_RV740: + case GPU_RV770: + return GK_R700_DOUBLE_OPS; + case GPU_PALM: + case GPU_CEDAR: + case GPU_SUMO: + case GPU_SUMO2: + case GPU_REDWOOD: + case GPU_JUNIPER: + return GK_EVERGREEN; + case GPU_HEMLOCK: + case GPU_CYPRESS: + return GK_EVERGREEN_DOUBLE_OPS; + case GPU_BARTS: + case GPU_TURKS: + case GPU_CAICOS: + return GK_NORTHERN_ISLANDS; + case GPU_CAYMAN: + case GPU_ARUBA: + return GK_CAYMAN; + case GPU_TAHITI: + case GPU_PITCAIRN: + case GPU_VERDE: + case GPU_OLAND: + return GK_SOUTHERN_ISLANDS; + case GPU_BONAIRE: + case GPU_KABINI: + case GPU_KAVERI: + case GPU_HAWAII: + return GK_SEA_ISLANDS; + default: + return GK_NONE; + } + } + + // These are documented in the AMD OpenCL Programming guide for identifying + // which device is targeted. + static StringRef getAMDCompatDeviceMacro(GPUKind Kind) { + switch (Kind) { + case GPU_R600: + case GPU_RV610: + case GPU_RV620: + case GPU_RV630: + case GPU_RV635: + case GPU_RS780: + case GPU_RS880: + case GPU_RV670: + return ""; + case GPU_RV710: + return "__ATI_RV710__"; + case GPU_RV730: + return "__ATI_RV730__"; + case GPU_RV740: + return "__ATI_RV740__"; + case GPU_RV770: + return "__ATI_RV770__"; + case GPU_PALM: + return "__Loveland__"; + case GPU_CEDAR: + return "__Cedar__"; + case GPU_SUMO: + return "__WinterPark__"; + case GPU_SUMO2: + return "__BeaverCreek__"; + case GPU_REDWOOD: + return "__Redwood__"; + case GPU_JUNIPER: + return "__Juniper__"; + case GPU_HEMLOCK: + case GPU_CYPRESS: + return "__Cypress__"; + case GPU_BARTS: + return "__Barts__"; + case GPU_TURKS: + return "__Turks__"; + case GPU_CAICOS: + return "__Caicos__"; + case GPU_CAYMAN: + return "__Cayman__"; + case GPU_ARUBA: + return ""; // ??? + case GPU_TAHITI: + return "__Tahiti__"; + case GPU_PITCAIRN: + return "__Pitcairn__"; + case GPU_VERDE: + return "__Capeverde__"; + case GPU_OLAND: + return "__Oland__"; + case GPU_BONAIRE: + return "__Bonaire__"; + case GPU_KABINI: + case GPU_KAVERI: + return ""; // ??? + case GPU_HAWAII: + return "__Hawaii__"; + default: + return ""; + } + } public: R600TargetInfo(const llvm::Triple &Triple) - : TargetInfo(Triple), GPU(GK_R600) { + : TargetInfo(Triple), + GPU(GPU_NONE), + GPUGeneration(GK_NONE) { DescriptionString = DescriptionStringR600; AddrSpaceMap = &R600AddrSpaceMap; UseAddrSpaceMapMangling = true; } - const char * getClobbers() const override { + const char *getClobbers() const override { return ""; } @@ -1525,6 +1681,14 @@ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override { Builder.defineMacro("__R600__"); + + if (GPU != GPU_NONE) { + Builder.defineMacro("__GPU__"); + + StringRef Macro = getAMDCompatDeviceMacro(GPU); + if (!Macro.empty()) + Builder.defineMacro(Macro); + } } BuiltinVaListKind getBuiltinVaListKind() const override { @@ -1533,47 +1697,48 @@ bool setCPU(const std::string &Name) override { GPU = llvm::StringSwitch(Name) - .Case("r600" , GK_R600) - .Case("rv610", GK_R600) - .Case("rv620", GK_R600) - .Case("rv630", GK_R600) - .Case("rv635", GK_R600) - .Case("rs780", GK_R600) - .Case("rs880", GK_R600) - .Case("rv670", GK_R600_DOUBLE_OPS) - .Case("rv710", GK_R700) - .Case("rv730", GK_R700) - .Case("rv740", GK_R700_DOUBLE_OPS) - .Case("rv770", GK_R700_DOUBLE_OPS) - .Case("palm", GK_EVERGREEN) - .Case("cedar", GK_EVERGREEN) - .Case("sumo", GK_EVERGREEN) - .Case("sumo2", GK_EVERGREEN) - .Case("redwood", GK_EVERGREEN) - .Case("juniper", GK_EVERGREEN) - .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS) - .Case("cypress", GK_EVERGREEN_DOUBLE_OPS) - .Case("barts", GK_NORTHERN_ISLANDS) - .Case("turks", GK_NORTHERN_ISLANDS) - .Case("caicos", GK_NORTHERN_ISLANDS) - .Case("cayman", GK_CAYMAN) - .Case("aruba", GK_CAYMAN) - .Case("tahiti", GK_SOUTHERN_ISLANDS) - .Case("pitcairn", GK_SOUTHERN_ISLANDS) - .Case("verde", GK_SOUTHERN_ISLANDS) - .Case("oland", GK_SOUTHERN_ISLANDS) - .Case("bonaire", GK_SEA_ISLANDS) - .Case("kabini", GK_SEA_ISLANDS) - .Case("kaveri", GK_SEA_ISLANDS) - .Case("hawaii", GK_SEA_ISLANDS) - .Default(GK_NONE); - - if (GPU == GK_NONE) { + .Case("r600", GPU_R600) + .Case("rv610", GPU_RV610) + .Case("rv620", GPU_RV620) + .Case("rv630", GPU_RV630) + .Case("rv635", GPU_RV635) + .Case("rs780", GPU_RS780) + .Case("rs880", GPU_RS880) + .Case("rv670", GPU_RV670) + .Case("rv710", GPU_RV710) + .Case("rv730", GPU_RV730) + .Case("rv740", GPU_RV740) + .Case("rv770", GPU_RV770) + .Case("palm", GPU_PALM) + .Case("cedar", GPU_CEDAR) + .Case("sumo", GPU_SUMO) + .Case("sumo2", GPU_SUMO2) + .Case("redwood", GPU_REDWOOD) + .Case("juniper", GPU_JUNIPER) + .Case("hemlock", GPU_HEMLOCK) + .Case("cypress", GPU_CYPRESS) + .Case("barts", GPU_BARTS) + .Case("turks", GPU_TURKS) + .Case("caicos", GPU_CAICOS) + .Case("cayman", GPU_CAYMAN) + .Case("aruba", GPU_ARUBA) + .Case("tahiti", GPU_TAHITI) + .Case("pitcairn", GPU_PITCAIRN) + .Case("verde", GPU_VERDE) + .Case("oland", GPU_OLAND) + .Case("bonaire", GPU_BONAIRE) + .Case("kabini", GPU_KABINI) + .Case("kaveri", GPU_KAVERI) + .Case("hawaii", GPU_HAWAII) + .Default(GPU_NONE); + + if (GPU == GPU_NONE) return false; - } - // Set the correct data layout - switch (GPU) { + GPUGeneration = getGenKind(GPU); + + // Set the correct data layout. + switch (GPUGeneration) { case GK_NONE: case GK_R600: case GK_R700: