はじめてのSSE その6

(問)
andnotのときに使った_mm_set1_epi8という命令に対応するアセンブリ命令は何か?


(答え)
直接対応する命令はありません。どこかのメモリに0xffが16バイト格納されて、(普通は)それをいったんxmmレジスタに取り出すコードが生成されます。


複数回、_mm_set1_epi8を使った場合は、共通の定数の削減という最適化が行われて、同じメモリ領域を参照します。


ゆえに、事前に0xffをどこかのメモリ上に16個並べて、それが定数(不変)だと何らかの方法でコンパイラに伝えることができるなら、それを使ってもほぼ同じ速度になります。(逆に言えばそのようにしても高速化にはつながらないということです)


いずれにせよ、この取り出すコードが必要なので、notには、xmmレジスタに取り出す + andnotという2命令が必要だと考えたほうが良いでしょう。


ループ内でnotをするなら、この「xmmレジスタに取り出す」部分は普通、最適化によってループの外(ループに入る前)に追い出されます。



つづく