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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU ローカルレジスタ

<<   作成日時 : 2012/02/05 18:32   >>

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

 GR0〜GR63を定義しているが64個もの汎用レジスタ、どう使うか?

 これまで以下のようなことを考えてきたがオマケ程度なので決め手に欠ける。あと、すっかり忘れてしまった。
ぼくのかんがえたさいきょうCPU ありあまるレジスタを活用するキュー操作命令
ぼくのかんがえたさいきょうCPU ありあまるレジスタを活用する配列支援命令

 MIPS/Alphaはゼロレジスタを除く汎用レジスタは31本でハード的には同じだが、ソフトを書く時には役割を決めて使っている。また、SPARC/IA-64はレジスタウィンドウを持ち、グローバル、ローカル、引数に役割を分けている。

 標準で64本、最大256本のレジスタをフラットのままにしておいても効率良く使えそうに思えない。これまではARM/PA-RISC/SPARC V9の様に割り込み時はレジスタを一部切り替えることも考えていたが、これだけの本数があるのになぜうまくいかないのか。ちょっと考えなおしてみた。

 レジスタの指定は6bitなので000000〜111111。この最下位ビットが"0"の時をグローバルレジスタ、"1"の時をローカルレジスタの指定に使う。

・GR0〜GR31 / LR0〜LR31

 GR0〜GR31は実際のレジスタと一対一に対応づけられる。
 LR0〜LR31は、新設したLOポインタと加算した値をローカル物理レジスタに割り当てる。

LO=0のとき
ADD GR1,0,LR0 # GR1→LR0に保存
ADD GR2,0,LR1 # GR2→LR1に保存
JSR 2,SUB1,A1 # LO=LO+2してA1にN番地を保存しサブルーチン呼び出し
N:
ADD LR0,0,GR3 # GR3にSUB1を呼び出した結果を保存
...

SUB1:
SUB LR2M,LR1M,LR1M # 呼び出し元のLR1−LR0を計算してLR0に戻す
RET 2,A1 # LO=LO-2してA1に戻る

ローカル物理レジスタをLP0〜とすると
LO=0の場合:LR0=LP0,LR1=LP1,...
LO=2の場合:LR2M=LP0,LR1M=LP1,LR0=LP2,LR1=LP3,...

LR0以降はローカルレジスタ、番号の大きい方はサブルーチンに渡す引数
LR2M,LR1Mは引数を受け取り、引数を返すこともできる
※ちょっとLR2M,LR1Mといった名前の付け方がよくないな。

LR(n)=LP(LO+n)、LR(m)M=LP(LO-m) といった関係。

これでサブルーチンはローカルレジスタを使うようにすればよい。ローカル物理レジスタが枯渇したら割込みを発生し、ローカル物理レジスタを退避させる。受け取る引数側もPR0より小さくなったら割込み発生。この場合は回復不能。

通常の割込みはLOにあらかじめSR(Status Register)で設定した値を加算し、ローカルレジスタを確保すればよい。これにより割込み時のバンクレジスタは不要となる。


 浮動小数点レジスタはどうするか。これはサブルーチン呼び出しではなく、明示的にポインタを操作する命令を用意する。または、FR0〜FR255と大量に用意するだけでもよい。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(1件)

タイトル (本文) ブログ名/日時
ぼくのかんがえたさいきょうCPU レジスタセット
 ようやく大和をお迎えできました。現在Lv55。 ...続きを見る
竹下世界塔の計算機よもやま話
2015/03/17 01:44

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




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