diff options
author | Eric Christopher <echristo@gmail.com> | 2015-10-08 20:10:18 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gmail.com> | 2015-10-08 20:10:18 +0000 |
commit | a7260af7e51e8ebc9b3b4ea1e6ffb9c61a92d181 (patch) | |
tree | ddf5295983c7af58341decd3b37763894d6696ab /clang/lib/Basic/Targets.cpp | |
parent | bbd746db9ed5b52ea00a1ec72ee67f15660e0921 (diff) | |
download | bcm5719-llvm-a7260af7e51e8ebc9b3b4ea1e6ffb9c61a92d181.tar.gz bcm5719-llvm-a7260af7e51e8ebc9b3b4ea1e6ffb9c61a92d181.zip |
Handle sse turning on mmx, but no -mmx not turning off SSE.
Rationale :
// sse3
__m128d test_mm_addsub_pd(__m128d A, __m128d B) {
return _mm_addsub_pd(A, B);
}
// mmx
void shift(__m64 a, __m64 b, int c) {
_mm_slli_pi16(a, c);
_mm_slli_pi32(a, c);
_mm_slli_si64(a, c);
_mm_srli_pi16(a, c);
_mm_srli_pi32(a, c);
_mm_srli_si64(a, c);
_mm_srai_pi16(a, c);
_mm_srai_pi32(a, c);
}
clang -msse3 -mno-mmx file.c -c
For this code we should be able to explicitly turn off MMX
without affecting the compilation of the SSE3 function and then
diagnose and error on compiling the MMX function.
This is a preparatory patch to the actual diagnosis code which is
coming in a future patch. This sets us up to have the correct information
where we need it and verifies that it's being emitted for the backend
to handle.
llvm-svn: 249733
Diffstat (limited to 'clang/lib/Basic/Targets.cpp')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 0f900db7531..7038808ec73 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -2725,6 +2725,14 @@ bool X86TargetInfo::initFeatureMap( FeaturesVec.end()) Features["prfchw"] = true; + // Additionally, if SSE is enabled and mmx is not explicitly disabled, + // then enable MMX. + I = Features.find("sse"); + if (I != Features.end() && I->getValue() == true && + std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") == + FeaturesVec.end()) + Features["mmx"] = true; + return true; } @@ -3004,17 +3012,6 @@ bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, return false; } - // Don't tell the backend if we're turning off mmx; it will end up disabling - // SSE, which we don't want. - // Additionally, if SSE is enabled and mmx is not explicitly disabled, - // then enable MMX. - std::vector<std::string>::iterator it; - it = std::find(Features.begin(), Features.end(), "-mmx"); - if (it != Features.end()) - Features.erase(it); - else if (SSELevel > NoSSE) - MMX3DNowLevel = std::max(MMX3DNowLevel, MMX); - SimdDefaultAlign = hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128; return true; |