Надлежащий способ включить SSE4 для каждой функции / блока кода?

Для одной из моих программ OS X у меня есть несколько оптимизированных случаев, в которых используются инструкции SSE4.1. На машинах только для SSE3 неоптимизированная ветвь запускается:

// 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
    ...
}

Чтобы скомпилировать вышесказанное, мне нужно было установитьCLANG_X86_VECTOR_INSTRUCTIONS вsse4.1.

Тем не менее, это, кажется, инструктирует Clang, что можно использоватьROUNDSD Инструкция в любом месте моей программы. Следовательно, программа падает на компьютерах только с SSE3 сSIGILL: ILL_ILLOPC.

Какова лучшая практика для включения SSE4.1 только для строк кода внутри истинной ветвиSupportsSSE4_1() если блок?

Ответы на вопрос(3)

Ваш ответ на вопрос