ぼくのかんがえたさいきょうCPU アドレスレジスタの復権
古くは8ビット80系のHLレジスタ、Z80のIX,IY、6809のX,Yレジスタ、そして68000のA0~A7。これらはRISCアーキでは汎用レジスタに吸収されてしまった。
今、アドレスレジスタを復活させたらどうなるのか?メリットとデメリットを比較したい。
GR0~GR63に加えてロードストア命令のアドレッシングのみAR0~AR63が使えることとする。
例: LD [AR1+AR2],GR1
メリット:ロードストア、分岐の実装が楽になる
・汎用レジスタファイルのポート数が減らせる。ロードストアユニットと演算ユニットの独立性が高まる。
・分岐予測などの参照に使いやすい。
・プリフェッチがやりやすい。
・ポストインクリメント・プリデクリメントがやりやすい。
・アドレスレジスタをレジスタリネーミングの対象から外せる。値が変わるのはAR++,--AR,汎用レジスタからのコピーのみ。
・レジスタ間の依存関係の判断を汎用レジスタのみに絞れる。
・従来のLD [GR0+GR1],GR2でGR0をゼロレジスタ扱いしなくて済む。AR0を0アドレスレジスタとすると LD[AR0+AR1],GR2と書ける。
デメリット:リソースを食う、ソフトウェアが面倒
・汎用レジスタとアドレスレジスタ間の転送命令が必要。
・汎用レジスタとは独立したレジスタファイルが必要、ただし汎用レジスタよりは単純にできる。
・割り込みの時のレジスタ退避をどうするか?ソフトウェア側で使用するレジスタを決めてしまうか?
・64本もいるか?
アドレスレジスタを明示的にすることは、内部実装の一部をソフトウェア側に見せることになる。汎用レジスタのみのアーキでもアドレス参照のレジスタは内部的に持っている。これにより実装は楽な方向に行くが、ソフトは細かな記述をしなければならない。
汎用レジスタにすべて押し付けると、レジスタ周りの負担が大きくなる。同時にリードライトできるポートは増え、ぶら下がる回路は増え、これはディレイにも影響する。最大256本の汎用レジスタをすべてアドレス参照に使えるようにするよりも、別に分けたほうがいいかもしれない。
特にOutOfOrder実行の場合、ロード・ストア完了を待たせることになるが、アドレスレジスタの監視をするだけで汎用レジスタは演算のみに集中できる。
この時は
LD [AR0+AR1],AR2
のようにアドレスレジスタを必ず介するようにしてより明示的に演算とメモリアクセスを分離したほうがよい。こうすると間接アドレッシングを行おうとする時に汎用レジスタ間との転送命令を減らせる。
これはもう少し考えてみよう。メリットの方が大きいような気がしてきたからだ。
しかし実装のことは気にしないはずだったのだが、JVMやMMIXのようにソフトウェア中心のアーキにはしたくないという考えが働いたのだろう。やはり意識してしまう。
今、アドレスレジスタを復活させたらどうなるのか?メリットとデメリットを比較したい。
GR0~GR63に加えてロードストア命令のアドレッシングのみAR0~AR63が使えることとする。
例: LD [AR1+AR2],GR1
メリット:ロードストア、分岐の実装が楽になる
・汎用レジスタファイルのポート数が減らせる。ロードストアユニットと演算ユニットの独立性が高まる。
・分岐予測などの参照に使いやすい。
・プリフェッチがやりやすい。
・ポストインクリメント・プリデクリメントがやりやすい。
・アドレスレジスタをレジスタリネーミングの対象から外せる。値が変わるのはAR++,--AR,汎用レジスタからのコピーのみ。
・レジスタ間の依存関係の判断を汎用レジスタのみに絞れる。
・従来のLD [GR0+GR1],GR2でGR0をゼロレジスタ扱いしなくて済む。AR0を0アドレスレジスタとすると LD[AR0+AR1],GR2と書ける。
デメリット:リソースを食う、ソフトウェアが面倒
・汎用レジスタとアドレスレジスタ間の転送命令が必要。
・汎用レジスタとは独立したレジスタファイルが必要、ただし汎用レジスタよりは単純にできる。
・割り込みの時のレジスタ退避をどうするか?ソフトウェア側で使用するレジスタを決めてしまうか?
・64本もいるか?
アドレスレジスタを明示的にすることは、内部実装の一部をソフトウェア側に見せることになる。汎用レジスタのみのアーキでもアドレス参照のレジスタは内部的に持っている。これにより実装は楽な方向に行くが、ソフトは細かな記述をしなければならない。
汎用レジスタにすべて押し付けると、レジスタ周りの負担が大きくなる。同時にリードライトできるポートは増え、ぶら下がる回路は増え、これはディレイにも影響する。最大256本の汎用レジスタをすべてアドレス参照に使えるようにするよりも、別に分けたほうがいいかもしれない。
特にOutOfOrder実行の場合、ロード・ストア完了を待たせることになるが、アドレスレジスタの監視をするだけで汎用レジスタは演算のみに集中できる。
この時は
LD [AR0+AR1],AR2
のようにアドレスレジスタを必ず介するようにしてより明示的に演算とメモリアクセスを分離したほうがよい。こうすると間接アドレッシングを行おうとする時に汎用レジスタ間との転送命令を減らせる。
これはもう少し考えてみよう。メリットの方が大きいような気がしてきたからだ。
しかし実装のことは気にしないはずだったのだが、JVMやMMIXのようにソフトウェア中心のアーキにはしたくないという考えが働いたのだろう。やはり意識してしまう。
この記事へのコメント