x86 命令の実効アドレス (LEA 命令など) は「EU」によって計算されることをどこかで読みました。EUとは?実効アドレスの計算には正確に何が含まれますか?
私は MC68k 命令セットについてしか知りませんでした (UC Boulder がこれを最初に教えています)。Web を検索しても適切な x86 Web ページを見つけることができません。
x86 命令の実効アドレス (LEA 命令など) は「EU」によって計算されることをどこかで読みました。EUとは?実効アドレスの計算には正確に何が含まれますか?
私は MC68k 命令セットについてしか知りませんでした (UC Boulder がこれを最初に教えています)。Web を検索しても適切な x86 Web ページを見つけることができません。
Intel 独自のSoftware Developer's Manualsは、x86 に関する優れた情報源ですが、少しやり過ぎかもしれません (チュートリアルのようなものではなく、リファレンスのようなものです)。
EU (Execution Unit) 参照は、通常、算術および論理命令を担当するプロセッサの一部である ALU (Arithmetic Logic Unit) とは対照的である可能性が最も高いです。ただし、EU には、メモリ アドレスを計算するための算術機能もあります (または持っていました)。x86 LEA 命令は、これらの機能をアセンブリ プログラマに伝えます。
通常、かなり複雑なメモリ アドレスを x86 命令に指定できます。
sub eax, [eax + ebx*4 + 0042]
ALU が算術減算を処理する一方で、EU はアドレスの生成を担当します。
LEA を使用すると、限定されたアドレス生成機能を他の目的に使用できます。
lea ebx, [eax + ebx*4 + 0042]
と比べて:
mul ebx, 4
add ebx, eax
add ebx, 0042
私がリンクしたページの「第 1 巻」には、アドレッシング モードについて議論するセクション「3.7.5」があります。 EU(またはメモリインターフェイス部分の名前が何であれ)が可能な算術演算。
「Volume 2」は命令セットのリファレンスであり、LEA を含むすべての命令に関する決定的な情報が含まれています。
「EU」は実行ユニットの総称です。ALUは実行ユニットの一例である。FADD と FMUL、つまり浮動小数点加算器または乗算器は、他の例です。つまり、ロードとストア用のメモリ ユニットです。
LEA 命令に関連する EU は、ALU (加算、減算、AND/OR など) と AGU (アドレス生成ユニット) です。AGU は、メモリ パイプライン、TLB、データ キャッシュなどに結合されます。
最初の codegen ガイドを書いたときの典型的な Intel x86 CPU には、2 つの ALU、AGU に接続された 1 つのロード パイプライン、2 番目の AGU に接続されたストア アドレス パイプライン、およびストア データ パイプラインがありました。2016 年の時点では、ほとんどが 3 つまたは 4 つの ALU と複数のロード パイプを備えています。
LEA は、BaseReg+IndexReg*Scale+Offset の 3 入力命令です。x86 のメモリ アドレッシング モードと同様に、実際には 4 番目の入力であるセグメント ベースがあり、これは LEA 計算の一部ではありません。3 つの入力は、必然的に ADD に必要な 2 つの入力よりも多くのコストがかかります。
一部のマシンでは、ALU は 2 つの入力演算しか実行できません。したがって、LEA は AGU、特にロードに使用される AGU でのみ実行できます (ストア ALU はレジスタを書き込まないため)。これは、同じサイクルで 2 つの Add と 1 つのロードを行うことができるのに対し、Load と同時に LEA を実行したり、同時に 2 つの LEA を実行したりできないことを意味する場合があります。
他のマシンでは、LEA は 1 つ、2 つ、または 3 つの ALU で実行できます。おそらくAGUの代わりに - おそらくALUと同様に。これは、柔軟性が高いことを証明しています。
または、regスケール + オフセットなどの単純な LEA は ALU で実行できますが、breg + iregスケール + オフセットなどの最大の LEA は制限されるか、場合によっては 2 つの uop に分割されることさえあります。
では、問題は、どの EU (Execution Unit) がどの LEA を処理するのかということです。ALUまたはAGU?答えはマシンによって異なります。
最適化ガイドの一般的なテキストは、「モデルに応じて AGU または ALU」または「その特定の LEA を処理できる EU」ではなく、単に「EU」と言う場合があります。
EU = 実行単位?
実効アドレスは、LEA
命令が何らかの算術またはその他のデータ アクセスを実際に実行する命令であった場合にアクセスされるアドレスです。その「意図された」使用は、ポインター算術演算または配列インデックス操作からの結果のポインターを計算することです。ただし、乗算と加算の組み合わせを実行できるため、通常の計算を最適化するためにも使用されます。
1 つのファミリ内のプロセッサの内部構造は長年にわたって大幅に変更されているため、「EU」の参照は正確な CPU モデルで明確にする必要があります。m68k での経験に例えると、68000、010、020、030、040、および 060 の命令セットはほとんど同じですが、内部構造はまったく異なるため、内部名への参照には部品番号を付ける必要があります。