У меня есть код, который использует внутренние команды SSSE3 (обратите внимание на тройку S) и проверку во время выполнения, нужно ли его использовать, поэтому я предположил, что приложение должно выполняться на процессорах без поддержки SSSE3.
Однако при использовании -mssse3 с оптимизацией -O1 компилятор также вставляет инструкции SSSE3, которые я не вызывал явным образом, поэтому программа аварийно завершает работу.
Есть ли способ включить код SSSE3, когда я ЯВНО вызываю соответствующие встроенные функции, но не позволяю компилятору добавлять свой собственный код SSSE3?
Обратите внимание, что я не могу отключить оптимизацию -O1.
Решение этой проблемы — НЕ компилировать ВСЕ программный код с опцией -mssse3, а скомпилировать только ту часть, которая фактически использует эти функции с этой опцией. Другими словами:
// main.cpp
...
if (use_ssse3())
do_something_ssse3();
else
do_something_traditional();
// traditional.cpp:
void do_something_traditional()
{
...
code goes here ...
}
// ssse3.cpp:
void do_something_ssse3()
{
...
code goes here ...
}
Только «ssse3.cpp» должен быть скомпилирован с -mssse3
флаг.
Если вы используете gcc, вы можете просто скомпилировать код, не используя -mssse3
переключить и потянуть в SSSE3 с
#define __SSSE3__ 1
#include <tmmintrin.h>
где они вам нужны.