С правильно сконструированным кодом C / C ++ можно подсказать gcc для создания эффективного SIMD-ассемблера самостоятельно, без использования встроенных функций, например https://locklessinc.com/articles/vectorize/
Я пытаюсь добиться аналогичного эффекта для операции movemask ( PMOVMSKB / * _movemask_epi8), но пока безуспешно.
Простейший код, который я могу себе представить:
#include <cstdint>
alignas(128) int8_t arr[32];
uint32_t foo()
{
uint32_t rv = 0;
for (int it = 0; it < 32; ++it)
{
rv |= (arr[it] < 0) << it;
}
return rv;
}
приводит к сборке, в которой не используется перемещениеинструкция маски: https://godbolt.org/z/3XimYc
У кого-нибудь есть идея, если есть способ сделать это с помощью gcc без явного использования встроенных функций?
Я не изучал MDфайлы и связанная с ними реализация в gcc еще (https://github.com/gcc-mirror/gcc/tree/master/gcc/config/i386).