ssse3 オペコード pshufb を使用して 0xPQ を 64 ビット値 0xPQPQPQPQPQPQPQPQ に変換する gcc の自動ベクトル化 (つまり、組み込み関数ではない) が必要です。ただし、pshufb オペコードが gcc によって他の用途に出力されていることは確認できますが (したがって、コンパイラは間違いなくそれを出力できます)、この特定のケースでそれをトリガーするために必要な一連の C 命令を解決できません。
助言がありますか?ありがとう!
ssse3 オペコード pshufb を使用して 0xPQ を 64 ビット値 0xPQPQPQPQPQPQPQPQ に変換する gcc の自動ベクトル化 (つまり、組み込み関数ではない) が必要です。ただし、pshufb オペコードが gcc によって他の用途に出力されていることは確認できますが (したがって、コンパイラは間違いなくそれを出力できます)、この特定のケースでそれをトリガーするために必要な一連の C 命令を解決できません。
助言がありますか?ありがとう!
レジスタpshufb
の下部に結果を表示するつもりがない限り、これが最も効率的なソリューションになるとは思えません。xmm
あれば、実際の使用例を示してください。
次のようなものを書く場合:
long long foo(char x)
{
long long ret;
std::memset(&ret, x, sizeof ret);
return ret;
}
gcc と clang はどちらも基本的に乗算x
するだけ0x0101010101010101
で、a と同じくらい高速pshufb
です (既にレジスタにその値があると仮定します)。ただし、imul
結果は既に汎用レジスタにあります (追加movq
は必要ありません)。
Godbolt のコンパイル結果: https://godbolt.org/z/dTvcsM (-msse3
少なくとも-O1
.