適切に構築された C/C++ コードを使用すると、組み込み関数を使用せずに効率的な SIMD アセンブラーを独自に生成するように gcc にヒントを与えることができます (例: 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 )。