Я сомневаюсь, что 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
).