2021:レジスタの仕組み

 汎用レジスタは固定した役割はなくロードストアや演算時にすべて同じ様に扱われるビット列の一時置き場である。例外はあって、常に0が読み出されるゼロレジスタは3オペランド命令で便利に使うことができる。また、スタックを持たないアーキテクチャでは特定の番号のレジスタがサブルーチンコール時の戻り番地を保存する場所になる。その他の汎用レジスタの用途はOS上で引数を渡すもの、ワークとして使うものなどの決め事がある。これに関してハードウエアで特別な機能があるわけではない。

アプリケーションバイナリインタフェース

 サブルーチンの呼び出し時や割り込み発生時にはレジスタをどこかに退避しなければならない。汎用レジスタの番号には限りがあるが、内部に多数の物理レジスタを持って命令1つでその割当てを変えるのがレジスタウィンドウである(Am29000、SPARC、i960、H16、IA-64など)。引数を特定のレジスタに格納してサブルーチンコール命令を発行すれば、サブルーチンにジャンプすると同時にレジスタウィンドウが動いて、サブルーチン側で参照する引数や結果を返す場所、作業用のローカルレジスタが確保される。また、IA-64ではループを効率よく実行するソフトウェア・パイプライニングの補助として使われる。

 ただ、レジスタウィンドウは仕組み上そのメカニズムを命令セットで意識しなければならない。またサブルーチンコールを効率化するといっても引数の数や呼び出し段数の上限があり、それを越えると一気に効率が落ちてしまう。これは予期しない場所での速度低下が発生する。

 インテルのx86はレジスタを連結して使用できるが、例えばAH:ALを連結したAXレジスタについて、ALを0クリアしてもAHは変化しないのでAXレジスタとして見れば上位側に値が残る。連結をしない汎用レジスタではこのような特別扱いは起こらず、0クリアを意識した操作は必ずゼロになる。これは1つのレジスタに対して3通りのアクセス方法があるということになる。

 その他、特別な状態を持つレジスタは極力持ちたくない。


以上から考えた必要なもの:
・汎用レジスタの最適な本数
・ゼロレジスタは必要か
・リンクレジスタをどうするか
・これら以外に汎用レジスタに特別なメカニズムを持ち込まない

ブログ気持玉

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

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

→ログインへ

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

気持玉数 : 0

この記事へのコメント