Цифровые раскопки: ассемблерные вставки. Часть 2¶
Помимо SIMD-функций ассемблерные вставки используются ещё и в функциях проверки доступности SIMD-расширений на используемом процессоре. И в этих функциях тоже обнаружены проблемы.
Код этих ассемблерных функций расположен в файле cpuid.cpp. Пример функции проверки
1bool CPU_SSE3()
2{
3 __asm
4 (
5 ".intel_syntax noprefix \n"
6 "mov eax, 0x1 \n"
7 "cpuid; \n"
8 "and ecx, 0x1 \n"
9 "mov eax, ecx \n"
10 "leave \n"
11 "ret \n"
12 ".att_syntax \n"
13 );
14}
Не знаю, что не так с этим кодом, но эта функция приводила к segfault-ошибке. Т.к. смысл функции очевиден - проверка наличия SIMD-расширения (SSE3 в данном случае), то проще оказалось найти аналогичную по смыслу функцию на чистом C. На просторах интернета найдена подходящая функция. Слегка доработана и оставлена в 2ух экземплярах (один исходный CPU_CHECK_SIMD(), а второй - оптимизированный CPU_IS_SIMD_OPTION_ENABLED(enum CPU_SIMD_OPTIONS cpu_option) для использования в gps-sdr). Исходный вариант оставлен на случай, если захочется поиграться с SIMD-расширениями, появившимся после прекращения развития gps-sdr. Обе функции находятся в файле.