Какие инструкции C мне нужно использовать, чтобы получить gve x86-64 autovectorizer для вывода кодов операций pshufb? - PullRequest
1 голос
/ 18 октября 2019

Я бы хотел, чтобы автовекторизация gcc (то есть не встроенная) преобразовывала 0xPQ в 64-битное значение 0xPQPQPQPQPQPQPQPQ с использованием кода операции ssse3 pshufb. Однако, хотя я могу видеть, как gcc выводит коды операций pshufb для других целей (так что компилятор определенно способен выводить их), я не могу разработать серию инструкций C, необходимых для его запуска в данном конкретном случае.

Есть предложения? Спасибо!

1 Ответ

3 голосов
/ 18 октября 2019

Я сомневаюсь, что pshufb будет самым эффективным решением, если только вы не намереваетесь получить результат в нижней части xmm регистра. Если да, приведите пример фактического использования.

Если вы напишите что-то вроде:

long long foo(char x)
{
    long long ret;
    std::memset(&ret, x, sizeof ret);
    return ret;
}

Как gcc, так и clang просто умножают x на 0x0101010101010101, что так же быстро, какpshufb (при условии, что у вас уже есть это значение в регистре). Однако с imul результат уже есть в регистре общего назначения (и дополнительные movq не требуются).

Результаты компиляции Godbolt: https://godbolt.org/z/dTvcsM (-msse3 не делает никакихразница, как и другие параметры компиляции, если она не меньше -O1).

...