aboutsummaryrefslogtreecommitdiff
path: root/lib/Basic/Targets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Basic/Targets.cpp')
-rw-r--r--lib/Basic/Targets.cpp236
1 files changed, 179 insertions, 57 deletions
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
index 16c0c102f0..26bfb5eb4a 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -1165,9 +1165,6 @@ class X86TargetInfo : public TargetInfo {
bool HasAES;
bool HasAVX;
- // FIXME: Make this an enum and parse into the enum when set.
- std::string CPU;
-
/// \brief Enumeration of all of the X86 CPUs supported by Clang.
///
/// Each enumeration represents a particular CPU supported by Clang. These
@@ -1247,7 +1244,7 @@ class X86TargetInfo : public TargetInfo {
//@{
CK_Corei7,
CK_Corei7AVX,
- CK_Corei7AVXi,
+ CK_CoreAVXi,
//@}
/// \name K6
@@ -1275,7 +1272,7 @@ class X86TargetInfo : public TargetInfo {
CK_Athlon64SSE3,
CK_AthlonFX,
CK_K8,
- CK_K8SSE,
+ CK_K8SSE3,
CK_Opteron,
CK_OpteronSSE3,
@@ -1290,12 +1287,12 @@ class X86TargetInfo : public TargetInfo {
//@{
CK_Geode
//@}
- };
+ } CPU;
public:
X86TargetInfo(const std::string& triple)
: TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
- HasAES(false), HasAVX(false) {
+ HasAES(false), HasAVX(false), CPU(CK_Generic) {
LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
}
virtual void getTargetBuiltins(const Builtin::Info *&Records,
@@ -1335,9 +1332,54 @@ public:
return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : "";
}
virtual bool setCPU(const std::string &Name) {
- // FIXME: Reject invalid CPU names.
- CPU = Name;
- return true;
+ CPU = llvm::StringSwitch<CPUKind>(Name)
+ .Case("i386", CK_i386)
+ .Case("i486", CK_i486)
+ .Case("winchip-c6", CK_WinChipC6)
+ .Case("winchip2", CK_WinChip2)
+ .Case("c3", CK_C3)
+ .Case("i586", CK_i586)
+ .Case("pentium", CK_Pentium)
+ .Case("pentium-mmx", CK_PentiumMMX)
+ .Case("i686", CK_i686)
+ .Case("pentiumpro", CK_PentiumPro)
+ .Case("pentium2", CK_Pentium2)
+ .Case("pentium3", CK_Pentium3)
+ .Case("pentium3m", CK_Pentium3M)
+ .Case("pentium-m", CK_PentiumM)
+ .Case("c3-2", CK_C3_2)
+ .Case("yonah", CK_Yonah)
+ .Case("pentium4", CK_Pentium4)
+ .Case("pentium4m", CK_Pentium4M)
+ .Case("prescott", CK_Prescott)
+ .Case("nocona", CK_Nocona)
+ .Case("core2", CK_Core2)
+ .Case("penryn", CK_Penryn)
+ .Case("atom", CK_Atom)
+ .Case("corei7", CK_Corei7)
+ .Case("corei7-avx", CK_Corei7AVX)
+ .Case("core-avx-i", CK_CoreAVXi)
+ .Case("k6", CK_K6)
+ .Case("k6-2", CK_K6_2)
+ .Case("k6-3", CK_K6_3)
+ .Case("athlon", CK_Athlon)
+ .Case("athlon-tbird", CK_AthlonThunderbird)
+ .Case("athlon-4", CK_Athlon4)
+ .Case("athlon-xp", CK_AthlonXP)
+ .Case("athlon-mp", CK_AthlonMP)
+ .Case("athlon64", CK_Athlon64)
+ .Case("athlon64-sse3", CK_Athlon64SSE3)
+ .Case("athlon-fx", CK_AthlonFX)
+ .Case("k8", CK_K8)
+ .Case("k8-sse3", CK_K8SSE3)
+ .Case("opteron", CK_Opteron)
+ .Case("opteron-sse3", CK_OpteronSSE3)
+ .Case("x86-64", CK_x86_64)
+ .Case("geode", CK_Geode)
+ .Default(CK_Generic);
+
+ // FIXME: When in 64-bit mode, reject 32-bit only CPUs.
+ return CPU != CK_Generic;
}
};
@@ -1364,57 +1406,98 @@ void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
if (PointerWidth == 64)
Features["sse2"] = Features["sse"] = Features["mmx"] = true;
- if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
- CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
- ;
- else if (CPU == "pentium-mmx" || CPU == "pentium2")
+ switch (CPU) {
+ case CK_Generic:
+ case CK_i386:
+ case CK_i486:
+ case CK_i586:
+ case CK_Pentium:
+ case CK_i686:
+ case CK_PentiumPro:
+ case CK_Geode:
+ break;
+ case CK_PentiumMMX:
+ case CK_Pentium2:
setFeatureEnabled(Features, "mmx", true);
- else if (CPU == "pentium3") {
+ break;
+ case CK_Pentium3:
+ case CK_Pentium3M:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse", true);
- } else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64") {
+ break;
+ case CK_PentiumM:
+ case CK_Pentium4:
+ case CK_Pentium4M:
+ case CK_x86_64:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse2", true);
- } else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") {
+ break;
+ case CK_Yonah:
+ case CK_Prescott:
+ case CK_Nocona:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse3", true);
- } else if (CPU == "core2") {
+ break;
+ case CK_Core2:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "ssse3", true);
- } else if (CPU == "penryn") {
+ break;
+ case CK_Penryn:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse4", true);
Features["sse42"] = false;
- } else if (CPU == "atom") {
+ break;
+ case CK_Atom:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse3", true);
- } else if (CPU == "corei7") {
+ break;
+ case CK_Corei7:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse4", true);
setFeatureEnabled(Features, "aes", true);
- } else if (CPU == "corei7-avx") {
+ break;
+ case CK_Corei7AVX:
+ case CK_CoreAVXi:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse4", true);
setFeatureEnabled(Features, "aes", true);
//setFeatureEnabled(Features, "avx", true);
- } else if (CPU == "k6" || CPU == "winchip-c6")
+ break;
+ case CK_K6:
+ case CK_WinChipC6:
setFeatureEnabled(Features, "mmx", true);
- else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
- CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
+ break;
+ case CK_K6_2:
+ case CK_K6_3:
+ case CK_Athlon:
+ case CK_AthlonThunderbird:
+ case CK_WinChip2:
+ case CK_C3:
setFeatureEnabled(Features, "3dnow", true);
- } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
+ break;
+ case CK_Athlon4:
+ case CK_AthlonXP:
+ case CK_AthlonMP:
setFeatureEnabled(Features, "sse", true);
setFeatureEnabled(Features, "3dnowa", true);
- } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
- CPU == "athlon-fx") {
+ break;
+ case CK_K8:
+ case CK_Opteron:
+ case CK_Athlon64:
+ case CK_AthlonFX:
setFeatureEnabled(Features, "sse2", true);
setFeatureEnabled(Features, "3dnowa", true);
- } else if (CPU == "k8-sse3") {
+ break;
+ case CK_K8SSE3:
+ case CK_OpteronSSE3:
+ case CK_Athlon64SSE3:
setFeatureEnabled(Features, "sse3", true);
setFeatureEnabled(Features, "3dnowa", true);
- } else if (CPU == "c3-2") {
+ break;
+ case CK_C3_2:
setFeatureEnabled(Features, "mmx", true);
setFeatureEnabled(Features, "sse", true);
+ break;
}
}
@@ -1562,95 +1645,134 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Builder.defineMacro("__REGISTER_PREFIX__", "");
// Subtarget options.
- // FIXME: We should build an enum for the CPUs to switch on as we do it in
- // multiple places.
// FIXME: We are hard-coding the tune parameters based on the CPU, but they
// truly should be based on -mtune options.
- if (CPU == "i386") {
+ switch (CPU) {
+ case CK_Generic:
+ break;
+ case CK_i386:
// The rest are coming from the i386 define above.
Builder.defineMacro("__tune_i386__");
- } else if (CPU == "i486" || CPU == "winchip-c6" || CPU == "winchip2" ||
- CPU == "c3") {
+ break;
+ case CK_i486:
+ case CK_WinChipC6:
+ case CK_WinChip2:
+ case CK_C3:
Builder.defineMacro("__i486");
Builder.defineMacro("__i486__");
Builder.defineMacro("__tune_i486__");
- } else if (CPU == "i586" || CPU == "pentium" || CPU == "pentium-mmx") {
+ break;
+ case CK_i586:
+ case CK_Pentium:
+ case CK_PentiumMMX:
Builder.defineMacro("__i586");
Builder.defineMacro("__i586__");
Builder.defineMacro("__tune_i586__");
Builder.defineMacro("__pentium");
Builder.defineMacro("__pentium__");
Builder.defineMacro("__tune_pentium__");
- if (CPU == "pentium-mmx") {
+ if (CPU == CK_PentiumMMX) {
Builder.defineMacro("__pentium_mmx__");
Builder.defineMacro("__tune_pentium_mmx__");
}
- } else if (CPU == "i686" || CPU == "pentiumpro" || CPU == "pentium2" ||
- CPU == "pentium3" || CPU == "pentium3m" || CPU == "pentium-m" ||
- CPU == "c3-2") {
+ break;
+ case CK_i686:
+ case CK_PentiumPro:
+ case CK_Pentium2:
+ case CK_Pentium3:
+ case CK_Pentium3M:
+ case CK_PentiumM:
+ case CK_C3_2:
Builder.defineMacro("__i686");
Builder.defineMacro("__i686__");
// Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
Builder.defineMacro("__pentiumpro");
Builder.defineMacro("__pentiumpro__");
- if (CPU != "i686") {
+ if (CPU != CK_i686) {
Builder.defineMacro("__tune_i686__");
Builder.defineMacro("__tune_pentiumpro__");
- if (CPU == "pentium2" || CPU == "c3-2") {
+ if (CPU == CK_Pentium2 || CPU == CK_C3_2) {
Builder.defineMacro("__tune_pentium2__");
- } else if (CPU == "pentium3") {
+ } else if (CPU == CK_Pentium3) {
Builder.defineMacro("__tune_pentium2__");
Builder.defineMacro("__tune_pentium3__");
}
}
- } else if (CPU == "pentium4" || CPU == "pentium4m") {
+ break;
+ case CK_Pentium4:
+ case CK_Pentium4M:
Builder.defineMacro("__pentium4");
Builder.defineMacro("__pentium4__");
Builder.defineMacro("__tune_pentium4__");
- } else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") {
+ break;
+ case CK_Yonah:
+ case CK_Prescott:
+ case CK_Nocona:
Builder.defineMacro("__nocona");
Builder.defineMacro("__nocona__");
Builder.defineMacro("__tune_nocona__");
- } else if (CPU == "core2" || CPU == "penryn") {
+ break;
+ case CK_Core2:
+ case CK_Penryn:
Builder.defineMacro("__core2");
Builder.defineMacro("__core2__");
Builder.defineMacro("__tune_core2__");
- } else if (CPU == "atom") {
+ break;
+ case CK_Atom:
Builder.defineMacro("__atom");
Builder.defineMacro("__atom__");
Builder.defineMacro("__tune_atom__");
- } else if (CPU == "corei7" || CPU == "corei7-avx" || CPU == "core-avx-i") {
+ break;
+ case CK_Corei7:
+ case CK_Corei7AVX:
+ case CK_CoreAVXi:
Builder.defineMacro("__corei7");
Builder.defineMacro("__corei7__");
Builder.defineMacro("__tune_corei7__");
- } else if (CPU == "k6" || CPU == "k6-2" || CPU == "k6-3") {
+ break;
+ case CK_K6:
+ case CK_K6_2:
+ case CK_K6_3:
Builder.defineMacro("__k6");
Builder.defineMacro("__k6__");
Builder.defineMacro("__tune_k6__");
- if (CPU == "k6-2") {
+ if (CPU == CK_K6_2) {
Builder.defineMacro("__k6_2__");
Builder.defineMacro("__tune_k6_2__");
- } else if (CPU == "k6-3" || MMX3DNowLevel == AMD3DNow) {
+ break;
+ } else if (CPU == CK_K6_3 || MMX3DNowLevel == AMD3DNow) {
Builder.defineMacro("__k6_3__");
Builder.defineMacro("__tune_k6_3__");
}
- } else if (CPU == "athlon" || CPU == "athlon-tbird" || CPU == "athlon-4" ||
- CPU == "athlon-xp" || CPU == "athlon-mp") {
+ break;
+ case CK_Athlon:
+ case CK_AthlonThunderbird:
+ case CK_Athlon4:
+ case CK_AthlonXP:
+ case CK_AthlonMP:
Builder.defineMacro("__athlon");
Builder.defineMacro("__athlon__");
Builder.defineMacro("__tune_athlon__");
if (SSELevel != NoSSE)
Builder.defineMacro("__athlon_sse__");
- } else if (CPU == "k8" || CPU == "k8-sse3" || CPU == "x86-64" ||
- CPU == "opteron" || CPU == "opteron-sse3" || CPU == "athlon64" ||
- CPU == "athlon64-sse3" || CPU == "athlon-fx") {
+ break;
+ case CK_K8:
+ case CK_K8SSE3:
+ case CK_x86_64:
+ case CK_Opteron:
+ case CK_OpteronSSE3:
+ case CK_Athlon64:
+ case CK_Athlon64SSE3:
+ case CK_AthlonFX:
Builder.defineMacro("__k8");
Builder.defineMacro("__k8__");
Builder.defineMacro("__tune_k8__");
- } else if (CPU == "geode") {
+ break;
+ case CK_Geode:
Builder.defineMacro("__geode");
Builder.defineMacro("__geode__");
Builder.defineMacro("__tune_geode__");
+ break;
}
// Define __NO_MATH_INLINES on linux/x86 so that we don't get inline