竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU レジスタセット、その他

<<   作成日時 : 2009/07/23 04:07   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 できるだけ命令数は減らしたいし、命令間の依存関係もなくしたい。これらを実現しやすい、拡張が容易なレジスタセットやその他命令について改めて考える。以前と重複している内容はご勘弁を。
これらを実現するため、命令には多くの意味付けをする。不足分はプリフィックス命令でおぎなう。命令は長くなるが、そこは実装にがんばってもらおう。Pentium4で使われたトレースキャッシュとか。

・GR0-GR63: 汎用レジスタは64本、128ビット長を基本とする。下方展開として64ビット長、32ビット長、上方展開として256ビット長でも問題無いようにする。
GR0はゼロレジスタ。読み出し時はゼロ、書き込み時は無視。レジスタを比較したい時に使う。
レジスタをより短いビット長で使うモードを備える。例えば128ビット長の実装は、64ビット長、32ビット長でのモードを持つ。ただし必須ではない。
すべて符号拡張したデータとして扱う。128ビット長のレジスタを32ビット長モードで扱った場合は、上位の96ビットは符号拡張した値(all'1'かall'0')が格納される。レジスタ長のモードを切り換えたときに意図しないデータの保存をさせないためと、そのまま符号拡張データとしてすぐに使えるようにするため。
整数系SIMD演算を可能とする。通常の論理演算とグラフィックス用途の特殊な演算とを分けて考える。

・FR0-FR63: 浮動小数点レジスタは64本、128ビット長を基本とする。128ビット長は四倍精度まで、64ビット長は倍精度まで、32ビット長は単精度まで扱える。
必ずしも汎用レジスタと同じビット長さでなくてもよい。ビット長が長ければ分割して浮動小数点SIMD演算も可能。
FR0はゼロレジスタ。読み出し時はゼロ、書き込み時は無視。レジスタを比較したい時に使う。
FR1は"1.0"レジスタ。単精度で読めば単精度の1.0、倍精度で読めば倍精度の1.0、四倍精度で読めば四倍精度の1.0。書き込み時の動作は未定。(何かの動作に割り当てるかも)FR0,FR1はIA-64アーキを参考にした。しかしIA-64はこれらの固定値レジスタに書き込むと例外が発生する。なぜそうしたんだろう?
浮動小数点レジスタと汎用レジスタの相互転送は考えていない。レジスタ長の違いによる例外を考慮しなければならないことと、実装にレジスタ間のバイパスを用意しないといけないため。今のところ、メモリを経由した転送にする。

・SIMD演算専用レジスタは持たない。従来のプロセッサはSIMD演算を後で拡張したため別レジスタか浮動小数点レジスタが対象となっているが、ここでは整数系と浮動小数点系に分けてそれぞれ汎用レジスタ、浮動小数点レジスタで扱う。

・条件判断で使用するコンディションコードは各レジスタが1つずつ持つ。
汎用レジスタの場合: 整数演算の結果、整数ロード命令のロード値、ロード/ストア命令でのアドレッシングモードでプリデクリメント/ポストインクリメントを使用した時に変化。
浮動小数点レジスタの場合: 浮動小数点演算の結果、浮動小数点ロード命令のロード値。
ゼロレジスタが対象の場合はコンディションコードのみ変化。これは比較命令で使う。
コンディションコードはユーザモードからは見えない。条件分岐命令等が参照する。特権モードではコンディションコードの並びを格納したASI空間にアクセスできる。(コンディションコードは1レジスタにつきせいぜい4ビット)

・レジスタの本数は実装により拡張可能。プリフィックス命令で256本程度まで増やせる。これらは汎用レジスタ、浮動小数点レジスタそれぞれで設定。
・例外発生時の汎用レジスタ退避は、バンクレジスタを用意する。ビットフィールドで指定する。各トラップごとに重複しないように定義する。(必要があれば)特権モードで変更も可能。バンクレジスタを64本すべて持つ必要はない。
通常のトラップ:二進数で 00000000_00000000_000000000_11111110 : GR1からGR7がバンクレジスタに切り換わる ゼロレジスタは切り換えられない
外部からのトラップ: 二進数で 00000000_00000000_11111111_00000000 : GR8からGR15がバンクレジスタに切り換わる
MMU系のトラップ: 二進数で 00000000_11111111_00000000_00000000 : GR16からGR23がバンクレジスタに切り換わる
※例外の状態を保存するレジスタが必要だが、未検討。割り込みの種別と割り込み時のステータス、戻りアドレスを割り込みの段数分用意しなければならないはず。

・即値の設定
プレフィックス命令を使用し、43ビットまで設定可能とすると、3命令で128ビットの値が設定できる。
SETL imm[42:0],GRd -- 下位43ビットに設定、符号拡張
SETM imm[85:43],GRd -- 下位43ビットは無視、[85:43]を設定、符号拡張
SETH imm[127:86],GRd 上位[127:86]を設定
プレフィックス命令32ビット、命令32ビットとすると、コードの長さは32ビット×6で128ビットを設定可能。64ビットの場合は32ビット×4。
参考: SPARC V9の場合 64ビットの値の上位32ビットをimm32h,下位32ビットをimm32lとするとコードの長さは32ビット×6。なおかつワークレジスタを1本使用。
SETHI %hi(imm32h),%r1
OR %r1,%lo(imm32h),%r1 -- 上位32ビットを%r1レジスタの[31:0]にセット、[63:32]はゼロになる
SLLX %r1,32,%r1 -- %r1レジスタの上位32ビット[63:32]にシフトして保存
SETHI %hi(imm32l),%r2
OR %r1,%lo(imm32l),%r2 -- 下位32ビットを%r2レジスタの[31:0]にセット、[63:32]はゼロになる
OR %r1,%r2,%r1 -- 合成して%r1[63:0]に即値設定

 しかし、即値の設定は使用頻度の関係からあまり考えなくてもいいかも。例えばSuperHには32ビット即値をセットする命令はなく、メモリからロードすることになっている。ビットフィールド指定を使えばもっと簡単にできるかもしれない。

・分岐命令/絶対ジャンプ命令
アドレスの指定は2種類。相対分岐で近距離の場合は1命令、遠距離の場合はプリフィックス命令で追加指定。
絶対ジャンプはアドレスを汎用レジスタで指定するか、即値で指定できる範囲まで。(即値設定の項目に従うと43ビット)
いずれも即値は符号付きで扱う。

・分岐命令のヒント
分岐命令は分岐予測のためのヒントとなるフラグを持つ。例: 弱い分岐、強い分岐、弱い非分岐、強い非分岐
→分岐が成功したら値を入れたりインクリメント/デクリメントしたり…とか考えたが、それじゃCISCだ。分岐ユニットは演算ユニットとは分けて考えよう。

・Jump&Link命令
他のプロセッサのどれも変わらない。同じように作る。戻りアドレスを保存するレジスタは、割り込み時のバンクレジスタに重なってもよい。割り込み復帰時にバンクレジスタを元に戻すため。

・プリフェッチ命令
分岐命令と絶対ジャンプ命令のバリエーションで、プリフェッチ先のアドレスを指定。あくまでもプリフェッチ動作は命令/データキャッシュに対するヒント。設定によっては無視されたり頻度が変わったりする。

・メモリアクセスは32ビット単位のリトルエンディアンとする。これは命令フォーマットの長さが32ビットであること、レジスタの最小長さが32ビットであることから決定した。
バイエンディアンについて: このアーキではバイトアクセスはないので、バイト単位でのデータ入れ換えアクセスを可能とする。32ビット単位のバイエンディアンは可能だが意味がない。
例: 128ビット長レジスタ上のデータが 0x0706050403020100 であった場合のメモリへのストアを考える。
1バイト入れ換え: メモリ上は0x0607040502030001
2バイト入れ換え: メモリ上は0x0504070601000302
4バイト入れ換え: メモリ上は0x0302010007060504
(8バイト入れ換え) 256ビット長以上の時指定可能。
これらの指定は組み合わせることが可能。すべて指定すると 0x0001020304050607 となる。
実装は簡単なはず。データのロード/ストアユニットのメモリとの出入り口に付けるだけ。

・レジスタのライフについて
レジスタは命令列のある範囲内で値が有効であり、使い終わったら破棄されてもよいが、破棄されたかどうかわからないためコンテキストスイッチ切り替え時などではすべて保存しなければならない。浮動小数点レジスタでは保存のコストが大きいため、ある浮動小数点レジスタのグループが使われると1が立つビットを持つアーキテクチャもあるが、これは使用されたことしかわからない。(明示的にクリアする必要がある)
ここで各レジスタに有効な値であることを示すフラグを用意する。このフラグは値が保存される時に立つ。コンディションコードのセット条件と同じ。
汎用レジスタの場合: 即値設定、整数演算の結果、整数ロード命令のロード値、ロード/ストア命令でのアドレッシングモードでプリデクリメント/ポストインクリメントを使用した時にセット。GR0はゼロレジスタのため常にフラグは立たない。
浮動小数点レジスタの場合: 浮動小数点演算の結果、浮動小数点ロード命令のロード値。FR0,FR1は常にフラグは立たない。
破棄するときは演算命令中に明示的に記述する。演算命令のソースレジスタのみが対象。アドレッシングモードで使用するソースレジスタはこれらの指定はしない。(ベース、インデックスとして使うレジスタは破棄されることが少ないため)
例:
ADD GR1,GR2,GR3
SUB GR3T,GR4,GR5 --- GR3はこれ以降参照されない。フラグを落とす。

この機能はレジスタの本数と合わせて静的なレジスタリネーミングに役立つ。
汎用/浮動小数点レジスタの有効/無効を示すビットはASI空間で参照できる。これを参照してコンテキスト切り替えの時に使用する。また、割り込み時に使用するバンクレジスタはこのフラグを持たない(常にセット)。
※フラグが立っていないレジスタをソースとして使用したときに例外を発生させてもよい。いや、コードの安全性を高めるために発生させたほうがよい。(GR0,FR0,FR1は除外)
※割り込み時、ワークとしてメモリに内容を退避し使用したレジスタが、割り込み復帰時にフラグがセットされる可能性がある。→退避したレジスタの値を戻して、フラグを保存している場所を参照し、フラグを復元したあと、リターン値を返すレジスタだけセットする。

・プログラムカウンタ
明示的には参照されない。分岐命令でPC相対として参照される。32ビットレジスタ長のみのMMUが無い組み込み用途を考えると、PC相対のアドレッシングモードは必要かもしれない。
例:アドレッシングモードでGR0を指定した時はPC相対とし、LEA命令動作でPCの値を取り込むことが出来る。
LD #LEA,[GR0+imm],GRd = LD #LEA,[PC+imm],GRd -- GRdにはPC+相対の値が入る。immや同じ場所に指定できるレジスタは符号付き。
または、コントロールレジスタで参照。この場合はPC+相対値の計算が後で必要になる。

・コントロールレジスタ類はできれば用意したくない。定義するとしたら汎用レジスタと同じ64本、ステータスレジスタや割り込みの状態、プログラムカウンタなどよく使うものを選ぶ。(特権モード、ユーザモードの判断は必要かも)
レジスタはSR0-SR63、SR0-31はユーザモードアクセス可、SR32-63は特権モードのみアクセス化、としておくか。すべて下位32ビットが有効。格納するビット数の拡張が予想されるものは入れない。レジスタ本数の拡張はしない。

・動作モード、診断機能などに関する操作はASI空間に定義する。ステータス類は汎用レジスタの最小である32ビット長にする。ただしASI空間はメモリアクセスと同等なので連続したアドレスに割り振っても問題はない。(ASI空間についてはSPARCを参照)

・ASI空間の設定方法
SPARCアーキでは8ビットのASIレジスタが1本あり、またロード/ストア命令で直接番号を指定できた。今回はASI空間アクセスの切り替えが簡単に出来るよう、ASIレジスタを拡張する。ASI番号の値も32ビット有効。
ASIレジスタはASI0 - ASI15まで用意。このレジスタ番号をロード/ストア命令中に埋め込む。特別な意味を持つASIレジスタ番号もある。
ASI0 -- ロード時はLEA命令動作。ストア時は指定したASI番号に値をセット。
例: LD #0,[GR1+GR2],GR3 = LEA [GR1+GR2],GR3 -- LEA命令動作
例: ST #0,GR1,[GR0+imm] = SETASI GR1,ASI#imm -- GR1の値をASI番号immにセット
ASI1 -- MMUの変換を通した通常のメモリアクセス。ロード/ストア命令で暗黙に指定される。この番号に値をセットしようとすると例外発生。
例: LD #1,[GR1+GR2],GR3 = LD [GR1+GR2],GR3
ASI2-7 -- ユーザーモードにおけるASI番号。
ASI8-15 -- 特権モードのみ参照できるASI番号。ユーザーモードでロード/ストアに指定すると例外発生。ST #0 によるセットも例外発生。
ASI#8はI/O空間アクセス専用とするか。そうするとこの番号に値をセットしようとすると例外発生。
もし命令フォーマット中でビット数が不足したら、ASIレジスタ番号をASI0-7までにして半分づつユーザーモードと特権モードで使うことにする。最低でもこの8本まで、これ以下だと診断アクセスなど特権モードでの扱いが難しくなる。(4本で実質1本でも不可能ではないが)

 ふう。また、しばらく勉強しよう。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
URL(任意)
本 文




ぼくのかんがえたさいきょうCPU レジスタセット、その他 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる