命令を単純化することで命令セットを完成させる
では具体的にどんな形で実装したか? という設計目標が下の画像だ。
ちなみにこの命令セットを策定するにあたり、8/16bitはサポートから落ちている。この件は後にCalista Redmond氏(RISC-V International CEO)に直接聞いたこともあるのだが、過去にもそういう計画はなかったし今後もない、としていた。
基本的に8/16bitは現時点ではまだ市場はあるものの縮小傾向で、そこにリソースを注ぎ込んでも得られるものは少ないという判断だそうだ。この設計目標を受けての実装の目安が下の画像である。
命令セットのモジュラー化はMIPSやArmでも一時期行なっていた。例えばARM7コアの場合、広く利用されているのはARM7TDMIというものだが、これは以下の意味だった。
T:Thumb命令対応
DM:DSP Multiplier
I:ICE対応
ただこれはむしろ面倒くさいということでCortexの世代からは基本なくなっている。「基本」というのは、例えばMCU向けの場合はFPUやDSP拡張がオプション扱いで、最近ではHeliumというSIMD命令もオプション扱いで提供されるからだ。ただ主要な命令は全部入りになった形になっている。
これに対しRISC-Vの場合、基本命令セットは非常に少ない(50命令未満)ため、例えば最小構成のMCU向けでは最低これだけ実装しておけばRISC-Vプロセッサーを実装できる。
それ以外に、以下の拡張命令が用意されている。
M:整数乗除算
A:アトミック命令
F:単精度浮動小数点演算
D:倍精度浮動小数点演算
Q:4倍精度浮動小数点演算
ちなみにこのリストにはないが、他にB(ビット操作命令)/C(圧縮命令)/L(10進浮動小数点演算)/V(ベクトル演算命令)などがあるほか、今後の拡張予定としてJ(動的変換命令:Javaなどの仮想マシンに対応したもの)/P(Packed-SIMD命令)/T(トランザクションメモリー命令)などがすでに予約されている。
こうした拡張命令は、それが必要と思う場合に実装すればよいことになっている。これとは別にG(General)が定義されているが、上の画像にあるようにIMAFDの略であり、“RV64IMAFD”とか書かずに“RV64G”と書けば済む、という話である。
この命令の単純化は、ある種の割り切りで実現している。RISC-Vは3オペランドの命令に対応しているので、例えば加算のaddは下のフォーマットになる。
add rd, rs1, rs2
この場合rd = rs1 + rs2という処理がされるのだが、この際に計算がオーバーフローするかどうかのチェックは行なわない。したがって実際には以下の処理が必要になる。
add rd, rs1, rs2
slti rs3, rs2, 0
slt rs4, rd, rs1
bne rs3, rs4, overflow
x86ではadd命令を実行した後にFlag registerをチェックして、OF(Overflow Flag)が立っていたら例外処理に移るので2命令で判断できるわけだが、これが4命令に倍増することになる。
ただこれに対するAsanović教授の考え方は「こういう処理はMacro-Op Fusionを使うことで実質的な処理命令数を減らせる」というものである。
add命令にあれこれオプションを追加するとそれだけ命令数も増えるし実装も大変になる。昨今のアプリケーションプロセッサーは、複数の命令をまとめて処理するMacro-Op Fusionの実装がごく当たり前なので、このメカニズムを使えば実質的な処理性能を引き上げできる。こう割り切ってしまったことで、こと基本命令セットに関しては本当にシンプルになった。
この基本的な命令セットは2011年中に完成する。これを自身の研究の傍らに行なうのはなかなか難易度が高いというか、かなり忙しかっただろうと思うのだが、この後のRISC-V FoundationとSiFiveの設立に向け、Asanović教授はさらに忙しくなっていく。
週刊アスキーの最新情報を購読しよう
本記事はアフィリエイトプログラムによる収益を得ている場合があります