summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/Targets.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-02 22:40:39 +0000
committerChris Lattner <sabre@nondot.org>2009-03-02 22:40:39 +0000
commit96e43578fc47e31ae005f4b933c617d988682e5c (patch)
tree1e290855cff6c515c4b8079cf5cacdb1abd53308 /clang/lib/Basic/Targets.cpp
parentecd49037eccea1cce4fef6b695937e9074e570ca (diff)
downloadbcm5719-llvm-96e43578fc47e31ae005f4b933c617d988682e5c.tar.gz
bcm5719-llvm-96e43578fc47e31ae005f4b933c617d988682e5c.zip
Add plumbing to support programatically defining __SSE2__ and friends,
even though we still hard code sse2 for now. No support for 3dnow or sse4a, but someone could add that if they desired. llvm-svn: 65886
Diffstat (limited to 'clang/lib/Basic/Targets.cpp')
-rw-r--r--clang/lib/Basic/Targets.cpp33
1 files changed, 27 insertions, 6 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index b983f26bb34..bb9c861a170 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -415,8 +415,12 @@ const TargetInfo::GCCRegAlias GCCRegAliases[] = {
// X86 target abstract base class; x86-32 and x86-64 are very close, so
// most of the implementation can be shared.
class X86TargetInfo : public TargetInfo {
+ enum X86SSEEnum {
+ NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
+ } SSELevel;
public:
- X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
+ X86TargetInfo(const std::string& triple)
+ : TargetInfo(triple), SSELevel(SSE2) {
LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
}
virtual void getTargetBuiltins(const Builtin::Info *&Records,
@@ -485,12 +489,29 @@ void X86TargetInfo::getTargetDefines(std::vector<char> &Defs) const {
Define(Defs, "__nocona");
Define(Defs, "__nocona__");
Define(Defs, "__tune_nocona__");
- Define(Defs, "__SSE2_MATH__");
- Define(Defs, "__SSE2__");
- Define(Defs, "__SSE_MATH__");
- Define(Defs, "__SSE__");
- Define(Defs, "__MMX__");
Define(Defs, "__REGISTER_PREFIX__", "");
+
+ // Each case falls through to the previous one here.
+ switch (SSELevel) {
+ case SSE42:
+ Define(Defs, "__SSE4_2__");
+ case SSE41:
+ Define(Defs, "__SSE4_1__");
+ case SSSE3:
+ Define(Defs, "__SSSE3__");
+ case SSE3:
+ Define(Defs, "__SSE3__");
+ case SSE2:
+ Define(Defs, "__SSE2__");
+ Define(Defs, "__SSE2_MATH__"); // -mfp-math=sse always implied.
+ case SSE1:
+ Define(Defs, "__SSE__");
+ Define(Defs, "__SSE_MATH__"); // -mfp-math=sse always implied.
+ case MMX:
+ Define(Defs, "__MMX__");
+ case NoMMXSSE:
+ break;
+ }
}
OpenPOWER on IntegriCloud