最適化の世界って怖い

特に難しい計算をしているはずが無い機械語を手動でC言語に翻訳していたところ
突然桁違いに複雑な処理に遭遇して理解できずに苦しむ羽目になりました。
ある程度わかりやすくまとめたものをC言語として書き出してみると
bool proc(int32 a){
int64 b = (int64)a * 0xAAAAAAAB;
b = b >> 34;
b = b * 6;
if(a-b == 0){
return true;
} else {
return false;
}
}
こんなことをやっているコード。

このコードが一体何をやっているのか即答できた人が居たなら自分はその人に弟子入りしたい。
答えは、a%6==0をやっているだけである。

小難しい話はぐぐればわかるのでそちらにお任せするとして、要は時間のかかる除算をしないで%演算をするための最適化コードだったわけだ。
実際の機械語としては、a-b==0がsub命令だったり、*6がLEA+ADDだったりと更に読みにくくなっている。
これでどれだけ早くなるのかと言えば雀の涙程度(といっても倍率で言えば結構差があるのだが)だというのだから泣けてくる。
最適化の世界って怖いね。

コメントをどうぞ