Как может отсутствовать функция SSE2 в заголовке, в котором она должна быть? - PullRequest
3 голосов
/ 23 сентября 2019

Я работаю с инструкциями SSE2 на VS2013 и понял, что некоторые функции в документации Intel отсутствуют в заголовке, в котором они должны быть.

Метод void _mm_storeu_si32 (void* mem_addr, __m128i a) должно быть в #include <immintrin.h>, но это не так.У меня есть доступ к другим методам из этого заголовка, хотя, например, __m128d _mm_undefined_pd (void).

Если я выполняю поиск в самом файле заголовка (доставлен VS2013), в инструкции _mm_storeu_si32 действительно нет никаких упоминаний.

Как это может быть?

1 Ответ

3 голосов
/ 23 сентября 2019

В старом автономном руководстве по встроенным функциям _mm_storeu_si32 был указан в разделе «прочее».Теперь в онлайн-руководстве intrinsics оно указано в SSE2, но еще не все компиляторы его реализовали.В качестве переносного обходного пути (store_b) вы можете использовать:

#include<immintrin.h>
void storeu_a(void* mem_addr, __m128i a) {
    _mm_storeu_si32(mem_addr, a);
    return;
}

void storeu_b(void* mem_addr, __m128i a) {
    _mm_store_ss((float*)mem_addr, _mm_castsi128_ps(a));
    return;
}

С помощью clang это компилируется в идентичный код , но другой компилятор может выбрать movd вместо movssс store_a и / или store_b:

storeu_a(void*, long long __vector(2)):                     # @storeu_a(void*, long long __vector(2))
        movss   dword ptr [rdi], xmm0
        ret
storeu_b(void*, long long __vector(2)):                     # @storeu_b(void*, long long __vector(2))
        movss   dword ptr [rdi], xmm0
        ret
...