https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106195

            Bug ID: 106195
           Summary: RFE: Split -msse into -msse and -fenable-intrinsics
           Product: gcc
           Version: 12.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jengelh at inai dot de
  Target Milestone: ---

Some libraries may use cpuid to runtime-test for SSE availability, yet their
authors may, intentionally or not, cause a profound lack of #ifdef __SSE__
guards around sections that do use _mm_* functions. The problem is not tied to
SSE specifically; any CPU extension may be affected. Consider this source code:


#include <string>
#include <cpuid.h>
#include <xmmintrin.h>
struct ADLConfig {
        int cc=6,eid=0,bank=14,vol=0,pcm=0,pan=1,ban2k=false;
        std::string cbank;
};
ADLConfig adlConfig; // generates MOVAPS under -O2 -msse
int main()
{
        long x=0,a=0,b=0,c=0,d=0;
        __cpuid(x,a,b,c,d);
        if (x) {
                __m128 a,b;
                _mm_add_ss(a,b);
        } else {
                // <non-SIMD variant>
        }
}


Without -msse, compilation of the snippet fails.
With -msse, the program builds but then won't run on SSE-less CPUs, because SSE
is emitted in a place where it's undesired - basically the only places where it
*is* desired is the _mm calls. There should be a better option than to find and
edit all _mm callsites and add #ifdef __SSE__.
If only I could tell the compiler "-mno-sse -fenable-sse-intrinsics" or so..

Reply via email to