2016-08-24 5 views
4

たとえば、これらの2つの命令は同じサイクルで実行を開始するか、または相互に干渉しますか?同じレジスタを入力と出力として使用すると、同じサイクルで2つの命令を実行できますか?

MOV %RAX, (ADDR)  # AT&T syntax: store rax 
POP %RAX 
+0

もしそれが 'movl'ならeaxではないはずですか? –

+1

@LưuVĩnhPhúc:良い点、それは完全に偽のコードでした。私はそれが16ビットコードのためにAT&Tの構文を使用することはほとんどないので、16ビットのIntel構文(最初はWSTハザード)を仮定していました。 POP AX( 'popw%ax')は64ビットモードと32ビットモードで有効ですが、POPLはありません(これはx86-64というタグが付いています)。しかし、私はまだコードを変換するのがより明確であると考えました有効な64ビットAT&T構文に変換します。 –

+1

それは私が思うPlan9から来るGoのアセンブラの構文でした。それを変更していただきありがとうございます。あなたの書き換えは正しいです。 – Eloff

答えて

9

彼らはレジスタリネーミングのためTomasulo's algorithmを使用しているためはい、彼らは、近代的なアウトオブオーダーCPU上で同じサイクルで実行することができます。これはすべてwrite-after-read hazards like this, and also write-after-writeを完全に回避するため、順序違反実行はRead-After-Write真の依存関係によってのみ制限されます。

レジスタの名前を変更した後、popは、RAXの古い値(ストアの入力として)を保持するものとは異なる物理レジスタにRAXアーキテクチャレジスタの新しい値を書き込みます。

popはRAXの値に対して新しい依存関係チェインを開始するため、命令の相互作用はゼロです。 (その出力は書き込み専用です)pop(およびRAXを読み書きする命令)は、ストアされる値が長い依存関係チェーンによって生成される場合は特に、ストアの前の多くのサイクルで実行できます。

Agner Fog's microarch pdfと他のリンクも参照してください。タグwiki。


アップデート:私はあなたが同じレジスタを書いたり、自分のオリジナルのコード例は%マークをオフに左、およびAXを使用するので、同じレジスタを読み出すに関する2つの命令を求めていたと思ったので、私はそれが16だったと仮定bit Intel-syntaxです。とにかくこの部分をボーナスとして残す。

同じレジスタを読み取る2つの命令(リード・アフター・リード)はまったく危険ではありません。

Sandybridge以前のIntel CPUでは、同じサイクルで読み取ることができる最近変更されていないレジスタの数に制限がありますが、近くの命令で同じレジスタを複数回読み取ることは問題にはなりません。 (Agner Fogのmicroarch pdf、またはthis answer where it was relevantを参照してください)。

+0

魅力的で現代的でない順不同CPUは非常においしく複雑です:) – Eloff

関連する問題