_mm_andnot_si128を使う件

SSEの命令に_mm_andnot_si128()というのがあります。この命令を使うと、(Bitboardの)notしたあとandを取りたいときに1命令で処理することが出来ます。なかなか凄い命令です。ところが、従来、

drop_to = rank2_9_bb & ~ occupied; // 先手の香が打てる場所は敵の駒がない2から9筋

のように書いたときに、&と~とが個別に呼び出されるので、_mm_andnot_si128()を使うコードが生成されません。

そこで、上の場合、andnotという関数を用意して

drop_to = andnot(rank2_9,occupied);

のように書く必要がありました。これは、可読性がすこぶる悪いです。ソースコードがぐちゃぐちゃになっていきますね。

それなら「&~」を自動的に置換するようなプリプロセッサでも作ればいいじゃん、みたいな発想になるのは老害というものです。いまどきそんなの流行りません。

いまは、

「C++のExpression Templateでそれ出来るよ」

であります。

Bitboardクラスの演算子オーバーロードで_mm_andnot_si128()を使う
http://d.hatena.ne.jp/merom686/20151126/1448507504

個人的には、この素晴らしい発明に、2015年コンピューター将棋技術大賞(?)を差し上げたいところです。C++はまさに秘境でありますな。

Expression Templateについては以下の記事を参考にどうぞ。

Expression Template(Faith and Brave – C++で遊ぼう)
http://faithandbrave.hateblo.jp/entry/20081003/1223026720

_mm_andnot_si128を使う件」への3件のフィードバック

  1. &のうしろが ~なら &は _mm_andnot_si128 になり、

    &のうしろが ~でないなら &は _mm_and_si128 になるのかだぜ☆(^~^)

    それで &一発の読みやすさがそのままに
    ~、& 2連発分だったのが _mm_andnot_si128 一発になるのかなんだぜ☆

    こんなことやってるのか☆www(^▽^)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です