(小ネタ)比較してインクリメント/デクリメント

に公開

こんにちは。Nakamuraです。

SSE, AVXの比較結果は真の場合、全ビットが立ちますが、これは -1 とも解釈できるので、

 if (a == b) { c++; } 
 if (a == b) { c--; }

は、それぞれ、

 c = _mm_sub_epi32(c, _mm_cmp_eq(a,b)); // -1 を引く
 c = _mm_add_epi32(c, _mm_cmp_eq(a,b)); // -1 を足す

のように書けます。

インクリメントが減算になるのでシンプルな割に魔術っぽさが出せますね。

Fixstars Tech Blog /proc/cpuinfo

Discussion