Richtige Methode zum Aktivieren von SSE4 auf der Basis von Funktionen / Codeblöcken?

Für eines meiner OS X-Programme habe ich einige optimierte Fälle, in denen SSE4.1-Anweisungen verwendet werden. Auf Nur-SSE3-Computern wird der nicht optimierte Zweig ausgeführt:

// SupportsSSE4_1 returns true on CPUs that support SSE4.1, false otherwise
if (SupportsSSE4_1()) {

    // Code that uses _mm_dp_ps, an SSE4 instruction

    ...

    __m128 hDelta   = _mm_sub_ps(here128, right128);
    __m128 vDelta   = _mm_sub_ps(here128, down128);

    hDelta = _mm_sqrt_ss(_mm_dp_ps(hDelta, hDelta, 0x71));
    vDelta = _mm_sqrt_ss(_mm_dp_ps(vDelta, vDelta, 0x71));

    ...

} else {
    // Equivalent code that uses SSE3 instructions
    ...
}

Um das Obige zu kompilieren, musste ich setzenCLANG_X86_VECTOR_INSTRUCTIONS zusse4.1.

Dies scheint jedoch zu erklären, dass es in Ordnung ist, die zu verwendenROUNDSD Anleitung irgendwo in meinem Programm. Daher stürzt das Programm auf Nur-SSE3-Rechnern mit abSIGILL: ILL_ILLOPC.

Was ist die beste Praxis für die Aktivierung von SSE4.1 für nur die Zeilen, die der Code innerhalb des wahren Zweigs derSupportsSSE4_1() wenn blockieren?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage