对于我的一个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指令.因此,程序在仅使用SIGILL:ILL_ILLOPC的SSE3计算机上崩溃.