ぼくのかんがえたさいきょうCPU 2出力演算を使った命令について

 RISC系の3オペランド命令は引数を2つのレジスタでもらい、結果を1つのレジスタに書き込む。条件フラグを持つアーキテクチャはここでフラグが変化する。条件フラグを持たないアーキテクチャはオーバーフローなどが発生した場合はトラップで受けることもできる。条件フラグの存在はそれを特別扱いにしないといけないので依存関係の解消が面倒になる。条件フラグがない場合は必要な処理を行うまでに余計な演算が必要になる。
 ということで、2入力2出力の演算命令を考えてみた。出力のうち1つめは主な演算結果、2つめは演算後のステータスという風に考える。不要な結果はゼロレジスタを使用して捨てることができる。

・ADD Rs1,Rs2,Rd1,Rd2 → Rd1には加算結果、Rd2にはオーバーフロー、キャリーなどの情報が入る。ステータスが不要な場合はRs2にゼロレジスタ指定。
・SUB Rs1,Rs2,Rd1,Rd2 → Rd1=Rs1-Rs2。Rd1にゼロレジスタを指定し、Rd2を使用すれば比較命令になる。
・MUL Rs1,Rs2,Rd1,Rd2 → 乗算命令の結果はソースレジスタの桁数の二倍を使うことになるので、Rd1に下位、Rd2に上位の結果を格納する。
・DIV Rs1,Rs2,Rd1,Rd2 → Rd1は商、Rd2は剰余を格納する。

・AND Rs1,Rs2,Rd1,Rd2 → 論理演算は特にステータスは変化しなくてもよいので、Rd1に演算結果を、Rd2にそのビット反転を格納する。
・ANDN,OR,ORN,XORも同様。(ANDN,ORNはRs1を反転して与える)

・SR Rs1,Rs2,Rd1,Rd2 → 右シフトの結果はRd1を論理シフト、Rd2を算術シフトに割り当てる
・SL Rs1,Rs2,Rd1,Rd2 → Rd1は論理左シフト。Rd2は左ローテートにする。

 2つの結果を同時にレジスタに書くことになって内部の処理は複雑になるのではないか?いえ、2つの演算結果を同時に使わない限り2R1WのレジスタファイルでOK。主な結果とそのステータスを加算したりand/or取ったりはしないので、実行ステージで同時にレジスタに書き込まなくてもよい。単純な実装ではRd1を先に書き込み、Rd2を保留しておいて次のサイクルで書き込む。ゼロレジスタを指定していれば明示的に捨てることができる。アウトオブオーダー実装の場合はそもそも大規模になってしまうので、その時はしっかりと実装すればよい。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック