Я не знаю, есть ли способ заставить MSV C 2019 скомпилировать это устаревшее встроенное MMX c.
Безопасно использовать инструкции MMX в 64-битном коде на Windows, но MS не облегчает создание такого кода с использованием компиляторов MS. Intrinsi c может не поддерживаться более новым MSVC; используйте лучший компилятор (например, clang) , если вам нужно скомпилировать старый код с внутренними компонентами MMX, если нет обходного пути для MSV C.
(в начале истории x86-64 и 64-битный Windows, тот факт, что MS удалила некоторую поддержку MMX компилятора или ассемблера, заставил некоторых беспокоиться о том, что, возможно, ядро Windows не будет правильно выполнять переключение контекста для состояния x87 / MMX. Это сомнение было необоснованным. Если вы можете получить код MMX для компиляции / сборки, например, с помощью других инструментов, он все равно будет работать безупречно. Windows поддерживает его, а процессоры x86-64 в длинном режиме по-прежнему полностью поддерживают MMX. Я не использую Windows и я точно не помню, какая именно поддержка MMX была удалена.)
Конечно, обычно лучше использовать SSE2 вместо MMX , то есть функции epi32 вместо pi32 (или любой другой целочисленной ширины элемента). SSE2 является базовой для x86-64, а также требуется для SIMD двойной точности (включая intrinsi c) этого преобразования.
Вариант использования для этого преобразования (я думаю) главным образом для получения целочисленных векторов MMX для использования с существующим унаследованным MMX-векторизованным кодом.
Но в этом конкретном случае c cvtpd2pi
на самом деле не медленнее, чем cvtpd2qd
(обычный SSE2 _mm_cvtpd_epi32
) - оба - 2 моп, я думать, потому что даже в домене регистра XMM он должен перетасовать 32-битные целые числа в нижнюю часть. https://www.uops.info/table.html. В отличие от версии ps
, в которой преобразование FP-> int между регистрами XMM выполняется по одной операции.
MMX имеют более низкую пропускную способность, чем эквивалентные инструкции SSE2 / 3 для недавних процессоров (работающих на меньшем количестве портов), и mov устранение не работает на них.