Цифровые раскопки: ассемблерные вставки. Часть 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. Обе функции находятся в файле.