2021:BKSC 基本方針 汎用レジスタ

 ぼくのかんがえたさいきょうCPUとはなにか。色々あった計算機アーキテクチャは現在みんな使ってるx86-64、組み込みからスパコンまでArm、オープンなRISC-Vあたりに絞られてしまったがこれらから選ぶことではない。また、The MachineやThe Millのように現在の延長線上からかけ離れたようなアーキテクチャではない。これまでの計算機の特徴を取捨選択しほんの少しだけの未来に実現可能な命令セットと構造なのだ。今後長いのでぼくのかんがえたさいきょうCPUはBKSCと略す。

基本
1.ロードストアアーキテクチャ
2.パイプライン実行
3.データ/命令列ともリトルエンディアン
4.命令セットは1バイト単位の可変長命令
5.命令の種類:大分類は4種。ロードストア/演算/分岐/その他
6.オペコードとオペランドを分離
7.汎用レジスタのサイズは2のn乗(n≧0)単位
8.命令エミュレーションを容易にするメカニズム

1.は命令セットの定義とメカニズムをシンプルにするため、メモリアクセスと内部の動作を分離する。
2.は当然。動作の前提にしてよい。
3.は汎用レジスタのサイズを任意にするためには下位バイトからの列挙が都合がいい。
4.は拡張性を考えるとRISC系の固定長命令よりも柔軟に定義できる。
5.は命令を機能別に分類し、命令デコードを整理する。
6.はバイト単位でオペコードを定義し、1バイトオペコードは使用頻度の多い命令を割り当てる。オペランドのフォーマットは共通。
7.は汎用レジスタは1,2,4,8,16...バイトのサイズで定義する。より大きい汎用レジスタは小さいサイズを包含できる。
8.は命令のハードウェア実装とソフトウェア実装両方を可能にし、規模が変わっても同一命令の実行を可能にする。

汎用レジスタ
 プログラマに見える重要な構造。本数は4本以上、命令セットに押し込める分だけ。汎用レジスタ本数の上限がわかる設定レジスタが必要。この本数は上位モードからユーザーモードで見える本数を制限可能。
・汎用レジスタ本数設定レジスタ

 レジスタのサイズは2のn乗単位。例えば4バイトと8バイトの下位4バイト対象で結果が異なる演算(シフトなど)をどう扱うか。レジスタを使用する前にレジスタのサイズを宣言して初期化する。初期化時の値はオールゼロとする。これによりゼロレジスタ相当を1命令で用意できる。演算は基本的には同サイズのレジスタ同士で行い結果も同じサイズ。異なる場合は大小どちらかに合わせて計算する。宣言をしていないレジスタに対する読み書きはトラップ要因となる。0クリア実装はそんなに難しくない。宣言済みのレジスタに初めて書き込まれる時にレジスタファイルの領域を割り当てれば良い。
・レジスタ割当命令(割当開放も含む)

 汎用レジスタ1本を分割することによりベクトル演算に対応する。SIMD演算は汎用レジスタ間で行う。
・レジスタ割当命令(分割命令)

 算術演算で対象となる数値は整数や浮動小数点数がある。浮動小数点数は精度などのバリエーションがある。また、BCDも考慮すると数値の型が汎用レジスタに付与されなければならない。これにより算術演算命令は型ごとに用意しなくてよくなる。数値の形式変換も特別な命令は不要になる。論理演算やビット演算はこの属性を無視する。
・レジスタ割当命令(型)

これらについては以前考えたことをスライドにまとめた。
ぼくのかんがえたさいきょうCPU データ(スライド)
ぼくのかんがえたさいきょうCPU スカラ演算(スライド)
ぼくのかんがえたさいきょうCPU ベクトル演算(スライド)

 割り込みやコンテキスト切替のことを考慮すると、汎用レジスタのサイズ、分割、型といった属性も別途保存しなければならない。
・汎用レジスタの属性を可視化するか隠蔽するか

ブログ気持玉

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

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

→ログインへ

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

気持玉数 : 0

この記事へのコメント