P6アーキテクチャ - 余談レジスタリネーミング、レジスタがよりOPSの結果限られたユーザーは/ロードをこぼす過ごしていますか?
-
20-09-2019 - |
質問
私は動的言語VMの実装に関して、JITのデザインを勉強しています。私は種類のうち、だ場合だけ、ここまたはそこに少しは、とても素敵なこと、8088分の8086日以来、多くのアセンブリを行っていない。
私はそれを理解したよう、のx86(IA-32)アーキテクチャは、まだそれがいつもやっていること、今日と同じ基本的な限定されたレジスタセットを持っていますが、内部レジスタの数は飛躍的に成長してきたが、これらの内部レジスタは、一般的に使用できず、使用されていますレジスタリネーミングとそうでない場合は並列化することができませんでしたコードの並列パイプライン化を実現しています。これらの最適化は、全体のスループットおよび並列アルゴリズム、我々はまだx86のは、二重の持っていた場合、そのようなことオーバーヘッドをこぼすよりレジスタの結果で立ち往生している限られたレジスタセットのヘルプやレジスタを4倍ながら、私はかなりよく、この最適化を理解するが、私の気持ちはあります私たちに利用できる、典型的な命令ストリームで有意に少なく、プッシュ/ポップオペコードがあるかもしれませんか?それとも私が気付いていないのだということも、これを離れて最適化する他のプロセッサoptmizationsがあるのですか?私は整数の仕事のために仕事をする4つのレジスタを持っていますが、私のユニットはダース変数を持っているコードのユニットをした場合は基本的に、私はすべて2かそこらの手順については、潜在的にプッシュ/ポップを持っています。
いっその研究、または、個人的な経験への参照?
EDIT:x86_64版では、修正および情報のためのおかげで、二重x86-32である16個のレジスタを持っている。
。解決
命令のレイテンシによる気泡を非表示にするレジスタの名前を変更することに加えて、ほとんどのx86アーキテクチャはプッシュとポップをカウントし、同様のレジスタへのそれらの名前を変更するのに十分なスマートです。 x86での命令デコーダは、実際にトレースキャッシュに保存されている小型のマイクロプログラムにx86命令ストリームを回し、JITコンパイルのソートを実行することを忘れないでください。このプロセスの一部は、小さなオフセットスタック荷重を遮断し、同様にレジスタにそれらを回す含みます。このように、何か(あきらか愚かなと純粋に例)のように:
lwz eax,[ebp]
lwz ebx,[ebp+4]
add eax,[edx+0]
push eax
lwz eax,[ebp+8]
add eax,ebx
pop ebx
add eax,ebx
(内部レジスタは、の例のr0..r16命名されているふりをする)のようなものに調理
lw r3, edx
lw r1, ebp
lw r2, ebp+4 ; the constant '4' is usually stored as an immediate operand
add r1,r2
or r4,r1,r1 ;; move r1 to r4
lw r1, ebp+8
add r1,r2
or r2,r4,r4
add r1,r2
もちろん(実際にはトランジスタ数に収まる1とは異なり)魔法スマートデコーダが不要な動きのいくつかを崩壊してしまうが、私は作っていますポイントは、プッシュ/ポップで格納/負荷が実際になっているesp+(some small number)
しますシャドー・レジスタています。
他のヒント
2点:
(1)x86-64では、16のレジスタの数が2倍
あなたは、ほとんどの考えることができるように、(2)現代のx86 CPUで、L1キャッシュに既に存在するメモリ位置を使用する命令は、のほぼのように高速レジスタオペランドと同じ操作などであります
"メモリを登録する" として、L1