У меня есть куча упакованных чисел с плавающей запятой внутри регистра XMM (с использованием встроенных функций SSE):
__m128 xmm = _mm_set_ps(4.0f, 3.0f, 2.0f, 1.0f);
Я хотел бы преобразовать все это в целые числа за один раз. Я нашел встроенный, который делает то, что я хочу (_mm_cvtps_pi16()
), но дает 4x16-битное short вместо полноразмерного int. Внутренняя функция с именем _mm_cvtps_pi32()
возвращает int, но только для двух нижних значений в xmm
. Я могу использовать его, извлекать значения, перемещать вещи и использовать снова, но есть ли способ попроще? Почему не было бы простой 32-битной упакованной инструкции с плавающей запятой -> 32-битное целое число? Неужели оба помещаются в одно и то же пространство регистра XMM?
РЕДАКТИРОВАТЬ: Хорошо, теперь я вижу, что _mm_cvtps_pi32()
возвращает __m64 вместо __m128, что означает, что он работает с регистром MM ... в стиле MMX. Это объясняет, почему он возвращает только два int, но теперь мне интересно:
- Возникнут ли у меня проблемы при компиляции для x64? Сообщается, что __m64 там не поддерживается ...
- Почему они не расширили эту инструкцию после выхода SSE?
Спасибо!