Автоматическая векторизация с помощью SSE2 movemask для байтов в битовый массив с gcc - PullRequest
0 голосов
/ 23 января 2019

С правильно сконструированным кодом 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).

...