2

ssse3 オペコード pshufb を使用して 0xPQ を 64 ビット値 0xPQPQPQPQPQPQPQPQ に変換する gcc の自動ベクトル化 (つまり、組み込み関数ではない) が必要です。ただし、pshufb オペコードが gcc によって他の用途に出力されていることは確認できますが (したがって、コンパイラは間違いなくそれを出力できます)、この特定のケースでそれをトリガーするために必要な一連の C 命令を解決できません。

助言がありますか?ありがとう!

4

1 に答える 1

3

レジスタ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.

于 2019-10-18T17:18:12.303 に答える