4回目:乗算の代わりにシフト演算 - NF
前回の補足。サボりです。
おさらいです。
乗算命令は遅いという理由から、例えば「144」は128+16という2のべき乗の加算に変換できるため、アセンブリでは乗算(×1)が消えてシフト演算(×2)と加算(×1)に置き換えられてました。2のべき乗2つに分解できない数値、例えば「143」とかでは直値がそのままアセンブリに落ちてました。
では、「148」(=128+16+4)みたいな3つ以上の2のべき乗に分解できる場合はどうなるのか?
結論から言うと、これらは143と同じく直値となりました。幾つか試しましたが、加算1つで計算できる場合だけ乗算が消えるようでした。
ithare.com
このサイトによると乗算が7cycleとかに対して加算は1cycle(シフトも?)なので、加算×1+シフト×2なら分解する方が早いけど、加算×2+シフト×3なら微妙なので分解しない、みたいな判断があるんだろうか。あとレジスタ余計に使うのが嫌とか。わかりません。
という訳で今回は終わり