私が遭遇したすべてのCPUアーキテクチャには、対称レジスタがあります。つまり、読み込んだ値は、あなたが書いた値です。なぜプロセッサに非対称レジスタがないのですか?
レジスタ制限付き16ビット命令の場合、非対称レジスタを使用するケースがありますか?
- レジスタ0〜6は、関数呼び出しに対して「ローカル」です。この関数呼び出しで書かれた値は、読み込まれる値です。各レベルの関数呼び出しには独自のレジスタハードウェアがあるため、ローカルレジスタは暗黙的に保存されます。
- レジスタ7-9は、SMP CPU上の「グローバル」、おそらく「スレッドローカル」です。
- "call"レジスタ10-13に書き込まれた値は、この関数呼び出しコンテキストのから読み取られる値に影響しません。
- "コール"レジスタ10-13から読み取られた値は、呼び出し関数に書き込まれた値です。つまり、関数のレジスタ引数は不変です。
- "return"レジスタ14-15に書き込まれた値は、この関数呼び出しコンテキストで読み込まれる値に影響しません。
- "return"レジスタ14-15から読み取られた値は、直近の関数に返された関数に書き込まれた値です。
各機能レベルのレジスタには独自のハードウェアがあり、コール深度がハードウェアを超えた場合にのみスタックに書き込まれます。
(local) (global) (call) (ret)
global regset 07 .. 09
.
.
.
. | |^^
. v v | |
regsetN-1 00 .. 06 10 .. 13 14 15
|^ |^ | | ^^
v| v| v v | |
fnN-1 RW RW RW RW RW RW
| |^^
v v | |
regsetN 00 .. 06 10 .. 13 14 15
|^ |^ | | ^^
v| v| v v | |
fnN RW RW RW RW RW RW
| |^^
v v | |
regsetN+1 00 .. 06 10 .. 13 14 15
|^ |^ | | ^^
v| v| v v | |
このようなスキームは、2つ以上のレジスタによって各関数呼び出し内のレジスタ圧を下げますか?
これは新しいアイデアだとは思っていませんが、それが完了したかどうかに関心があります。それが狂ったアイデアではない、または既に完了している場合、私はFPGAのCPU上でこれを実装するかもしれません。
登録費用を節約するにはあまりにも複雑すぎますか?
llvm-difficultiesはこれが行われない主な理由はありますか?
P.S.私は、スーパースカラープロセッサはこれよりもはるかに複雑で、レジスタ名変更スキームなどを持っていることを認識しています。私はマイクロコントローラクラスのアーキテクチャについて考えています。
アップデート:これはSPARCアーキテクチャのようです。後のISAデザイナーがなぜそれが有用であると考えられなかったのですか?
プロシージャが呼び出されると、レジスタウィンドウは16個のレジスタに移動し、古い入力レジスタと古いローカルレジスタを隠し、古い出力レジスタを新しい入力レジスタにします。
なぜこれがマイクロアーキテクチャー(ハードウェア)レベルで実装される必要があるのかはわかりません。これは、デザイナーによって確立され、ソフトウェアによって遵守された規約と同じように簡単に行うことができます。あなたがしてはならないはずのレジスタへのハードウェアアシスト保護*を得られないと思いますが、これらの低レベルでは、とにかくこれらのタイプの保護は通常保証されません。それ以外にも、いったん16個のレジスタがあれば、「レジスタ限定」ISAに分類されるようなことはほとんどありません。 –
さらに、[register windows](https://en.wikipedia.org/wiki/Register_window)を実装する*アーキテクチャもありますが、これはあなたの記述にかなり似ていて、まったく同じではないと思われます。 –
あなたはそうだ、ハードウェアである必要がある理由はありません。それはISAだけかもしれません。 「保護」は目標ではなく、うれしい偶然でした。ポイントは、関数がそれ自身が呼び出された引数などを壊さずに(関数を呼び出す前に) "呼び出しレジスタ"に値を書き込むことができるため、ISAのレジスタ圧を緩和することです。 – fadedbee