2

コンパイラでのレジスタ割り当てに関するトピックを調べています。レジスタ割り当てに広く使用されているアルゴリズムは、単純化による反復グラフ彩色です。AndrewW.Appelによる著書「 ModernCompilerImplementationin Java」の第11章では、レジスタ割り当ての状態について次のように述べています。

干渉グラフの各ノードは一時的な値を表します。

[...]

一部の一時的なものは事前に色付けされています-それらはマシンレジスタを表します。フロントエンドは、たとえば、モジュールの境界を越えて標準の呼び出し規約に接続するときにこれらを生成します。フレームポインタ、standard-argument-1-register、standard-argument-2-registerなど、特定の目的に使用される実際のレジスタごとに、CodegenorFrameモジュールは永続的にバインドされている特定の一時レジスタを使用する必要がありますそのレジスタに。任意の色(つまり、任意のマシンレジスタ)に対して、その色の事前に色付けされたノードは1つだけである必要があります。

上記の引用で示された行を完全には理解していません。同じレジスターでプレカラーされる複数の一時的なものがある状況を想像することができます。たとえば、x86mul命令は結果をEDX:EAXレジスタペアに格納しますが、関数はレジスタに値も返しますEAX。だから私は同じ色の異なる一時的なものを持っています。それらの異なる使用法はEAX異なるノードでなければならないと思いますか、それとも私は間違っていますか?

誰かが強調表示された文を説明できますか、おそらくいくつかの例を提示できますか?

4

1 に答える 1

0

この本のアイデアは、単一の一時的な EAX を持ち、それをmul戻り値と一緒に使用することです。ある値を特定のレジスターに入れる必要がある場合、その値を含む一時的なものからそのレジスターを表す一時的なものへの移動を生成します。同様に、値が特定のレジスターに到達すると (たとえば、関数が返された場合)、レジスターの一時からその値を保持する一時への移動を生成します。本の図 11.7 を参照してください。

于 2012-11-29T09:30:11.493 に答える