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

アクセスカウンタ

zoom RSS スタックをどうするか?

<<   作成日時 : 2016/01/29 04:26   >>

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

 作業中のレジスタを一時的に保存しておいて後で取り出せるようにしておくためにスタックを使うことがある。例えばサブルーチンコールをした時に戻る番地はどこかに保存しておかなければならない。

 RISC系ではJump&Link命令で戻るべき番地を指定した汎用レジスタ(または決め打ちの汎用レジスタ)に保存してサブルーチンにジャンプし、戻るときはその保存したレジスタが参照する番地へとジャンプして戻る。サブルーチンがネストしたときの戻り番地の管理は自前で行わなければならない。x86などはスタックポインタとなるレジスタを使用して、メモリ上にPUSHで保存、POPで取り出しを行う。

 スタックを使って保存したいものは以下のとおり:
(1)サブルーチンの戻り番地
(2)サブルーチン呼出元のレジスタ(作業用レジスタ確保)
(3)割り込み発生時の戻り番地

 (1)についてはもう説明したので(2)について。レジスタは有限であり、サブルーチン側で作業用として使う場合はいったん使用するレジスタの番号とその値を保存し、あとで元に戻さなければならない。レジスタの番号についてはスタックに積んだ順を考慮して取り出せば問題なく対応した値が取り出せる。
レジスタウィンドウというしくみはこれらを効率よく行うために、命令で指定できる汎用レジスタの本数以上に隠された物理レジスタを持っていて、サブルーチン呼出時に新規の物理レジスタを割り当てることにより高速に多くのレジスタを退避させる。実装としては物理レジスタと論理レジスタの番号の対応付けをずらすだけなので1cycleで済みメモリ上のスタックに退避させるよりも速い。
(3)について。割り込み後はその命令をやり直すか、その命令の次に進むかの区別があるので現プログラムカウンタ(PC)の値と次のPCの値を保存することがある。現PCの値だけを保存して、割り込みから戻るときに次のPCを計算してもよい。SPARC V9は割り込みのための専用のハードウェアスタックを4段(〜MAXTLで指定される実装依存の数)持っている。割り込み発生時に次の割り込みが起こる多重割り込みはせいぜいこのくらいという考え。
また、割り込みは応答性を良くするために汎用レジスタの一部を割り込み用のレジスタに切り替える実装がある(PA-RISC,SPARC V9)。

 さて、スタックだがメモリ上に保存する形式のものはスタックポインタ用のレジスタを1本消費する。また、スタックへの操作はロードストアとなるので実装で特別扱いでもしないかぎり遅くなる。ハードウェアスタックは高速だが多くは用意できない。さてどうしようか?

 レジスタリネーミングというしくみがある。命令で指定できる論理レジスタ番号にたいして大量の物理レジスタを持ち、必要になった時に物理レジスタを論理レジスタ番号に割り当てるしくみで、Out of Order実行時の依存関係の解消につかわれる。この仕組みを流用して、次の命令を考えた。

PUSHIV レジスタ番号パターン
POP

PUSHIVは指定した64bitのパターンで64本のレジスタを保存し、指定したレジスタを新規に割り当てる。
実際の動作は対応する物理レジスタにスタックへpushする番号を付けて、論理レジスタ番号には新しい物理レジスタを割り当てる。
割り当てが物理レジスタ不足でできない場合はトラップを発生し、メモリ上へ退避する。ここでメモリ上を参照するスタックポインタが必要となるだろう。
POPはPUSHIVで隠した物理レジスタを対応する論理レジスタ番号に割り付けて表にだす。割りつけるべき物理レジスタが存在しなければスタックアンダーフローとなる。

こうすることでレジスタウィンドウのように命令セットレベルで意識することなく、またレジスタの並びに縛りがなくスタック操作ができる。ユーザレベルでスタックポインタ用のレジスタとスタックの深さを意識することもない。

サブルーチンコールに関してはプログラムカウンタ用のスタック操作命令を別に用意したほうが良さそうな気がしてきた。

PUSHPC
POPPC

もしくは、RISC系のJump&Link命令でいったん汎用レジスタに保存した後、PUSHIV/POPに任せる。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




スタックをどうするか? 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる