今回ご紹介するのは、拡張命令の1つので整数乗算/除算です。
これも組込みシステム向けの小さなマイコンを作るときにハードウェア量が大きい
もしくは、時間がかかると言う事になります。

マイコンの中で乗算をどうやっているのか?というの考えると、ハードウェア量が多い
ことが理解できると思います。32ビットx32ビットの乗算は出力が64ビットになるので、
まずはそれを以下の図で示してみました。基本的に乗算は加算の繰り返しになります。
そのため31回の加算を繰り返して、実行して結果が得ることができるので、以下の各行を
足し合わせていく事なります。


RV32Iの基本命令の加算ADD命令を31回も実施していることになるので、ハード量が増える、
もしくは、時間をかけてソフト的に実行するしかありません。
これを実際にどのくらい時間がかかるのかを見るのは簡単です。M拡張命令の有り/無しで
実行時間を比較すればよいです。
int hoo(int a, int b) {    
  return a*b;
}
この関数の実行時間を比較してみると、わかりますね(もちろん、関数呼び出しのオーバーヘッドあります)
もちろんデータにも依存するので、データの値も変えて実行してみました。
こちらはEWRISC-Vでコンパイルし、シミュレータ上で確認しました。

〇実験1
  a=0x1F0FFFF;
  b=0x0000003;
Mありの場合 → 4
Mなしの場合 → 19

〇実験2
  a=0x0000005;
  b=0x0000013;
Mありの場合 → 4
Mなしの場合 → 27

ですね。当然ハードウェアがあるのであれば、もちろん使いたい!と言う事になります。

M拡張命令で追加されるのは、以下の命令となります。


これのC命令も欲しかったですね。