命令セットアーキテクチャを考える(番外編) 特殊レジスタの汎用レジスタへの割り当て
汎用レジスタが64本もあるので、特殊レジスタを汎用レジスタ番号に割り当てたらどうでしょうか。
とは言っても、他のアーキテクチャにあるような、乗除算専用のMHI/MLOレジスタや、ループカウント用のカウントレジスタのようなものは、私の考えたアーキテクチャにはなく、命令のオペランドで汎用レジスタを使用するようになっています。また、スタックポインタレジスタのようなものもありません。
残りのPC(プログラムカウンタ)とCCR(コンディションコードレジスタ)を汎用レジスタに割り当てたらどうだろうかというところです。
PCを汎用レジスタ番号に割り当てると、分岐命令のPCモードがシンプルになります。これがこの番外編の一番目の動機です。
二番目の動機であるCCRについては、RISC Vアーキテクチャを参考に考えてみました。
https://riscv.org/specifications/
RISC Vの条件分岐命令では、汎用レジスタのRs1とRs2(私のシリーズでの記述ではRsとRtに相当)の比較結果によって分岐するかどうかを決定します。CCRのような特殊レジスタを使いません。この方法では、比較と条件分岐が1命令になっているため、比較、条件分岐という2命令よりもコンパクトになります。
また、条件分岐命令とは別にSLT(set Less Than)/SLTU(Set Less Than Unsigned)命令やFLT(Floating-point Less Than)やFLE(Floating-point Less Equal)命令があり、汎用レジスタ同士、浮動小数点レジスタ同士の比較結果を汎用レジスタに設定することができます。これらの命令と組み合わせることにより(実行ステップは増えますが)より柔軟な条件分岐が実現できます。
RISC Vの仕様書には、以下のような説明(注釈)が書いてあります。
The conditional branches were designed to include arithmetic comparison operations between two registers (as also done in PA-RISC and Xtensa ISA), rather than use condition codes (x86, ARM, SPARC, PowerPC), or to only compare one register against zero (Alpha, MIPS), or two registers only for equality (MIPS). This design was motivated by the observation that a combined compare-and-branch instruction fits into a regular pipeline, avoids additional condition code state or use of a temporary register, and reduces static code size and dynamic instruction fetch traffic. Another point is that comparisons against zero require non-trivial circuit delay (especially after the move to static logic in advanced processes) and so are almost as expensive as arithmetic magnitude compares. Another advantage of a fused compare-and-branch instruction is that branches are observed earlier in the front-end instruction stream, and so can be predicted earlier. There is perhaps an advantage to a design with condition codes in the case where multiple branches can be taken based on the same condition codes, but we believe this case to be relatively rare.
私の考えた条件分岐命令は、CCRのビット演算で柔軟に分岐できるように考えましたが、ハードウェア的には実装が面倒かもしれないと思い始めました。自分はハードウェアのことはわかりませんが、おそらく面倒でしょう。
それでは、私の考えたCCRに汎用レジスタ番号を割りつけたらどうでしょうか。そうすれば、CCR(汎用レジスタのうちの1本)に対するビット演算と、RISC V風の条件分岐命令で、柔軟な分岐が実現できます。
また、CCRのビットのうち、例外処理的なビットと、正負/零を示すビットを別の汎用レジスタ番号を割り当てれば、もっとシンプルになるかもしれません。
| 固定リンク
この記事へのコメントは終了しました。


コメント