NF

地方で働くプログラマ

5回目:乗算の代わりにシフト演算(2)

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なら微妙なので分解しない、みたいな判断があるんだろうか。あとレジスタ余計に使うのが嫌とか。わかりません。


という訳で今回は終わり