x86架构中的"EU"是什么?(计算有效地址?)

Ton*_*y R 7 x86 assembly cpu-architecture

我在某处读到x86指令中的有效地址(如LEA指令中)由"EU"计算.什么是欧盟?计算有效地址究竟涉及什么?

我只学习了MC68k指令集(UC博尔德首先教这个),我找不到一个好的x86网页,通过网络搜索.

aib*_*aib 6

英特尔自己的软件开发人员手册是关于x86的一个很好的信息来源,虽然它们可能有点过分(并且更像参考而不是教程).

EU(执行单元)参考最有可能与ALU(算术逻辑单元)形成对比,ALU通常是负责算术和逻辑指令的处理器的一部分.但是,欧盟也有(或有)一些算术能力,用于计算存储器地址.x86 LEA指令将这些功能传达给汇编程序员.

通常,您可以为x86指令提供一些非常复杂的内存地址:

sub eax, [eax + ebx*4 + 0042]
Run Code Online (Sandbox Code Playgroud)

当ALU处理算术减法时,EU负责生成地址.

使用LEA,您可以将有限的地址生成功能用于其他目的:

lea ebx, [eax + ebx*4 + 0042]
Run Code Online (Sandbox Code Playgroud)

与之比较:

mul ebx, 4
add ebx, eax
add ebx, 0042
Run Code Online (Sandbox Code Playgroud)

我链接的页面上的"第1卷"有一个"3.7.5"部分说明寻址模式 - 你可以为期望内存操作数(LEA是一个)的指令提供什么样的内存地址,反映出什么样的欧盟(或任何内存接口部分被称为)的算术能够.

"第2卷"是指令集参考,包含所有指令的确切信息,包括LEA.

  • 对于今天的所有多级流水线,多核,多单元来说,真的很难说.当ALU忙时,EU可以自由地进行这样的计算,反之亦然.哎呀,我甚至不确定欧盟/ ALU的区别是否存在. (2认同)

Kra*_*lew 5

“EU”是执行单元的总称。ALU 是执行单元的一个示例。FADD 和 FMUL,即浮点加法器或乘法器,是其他示例 - 因为,就此而言,它们是(是)内存单元,用于加载和存储。

与 LEA 指令相关的 EU 是 ALU(加、减、AND/OR 等)和 AGU(地址生成单元)。AGU 耦合到内存管道、TLB、数据缓存等。

当我编写第一个代码生成指南时,典型的 Intel x86 CPU 有 2 个 ALU、1 个连接到 AGU 的加载管道、一个连接到第二个 AGU 的存储地址管道和一个存储数据管道。截至 2016 年,大多数有 3 或 4 个 ALU 和不止一个负载管道。

LEA 是一个 3 输入指令 - BaseReg+IndexReg*Scale+Offset。就像 x86 的内存寻址模式,它实际上有第 4 个输入,即段基址,这不是 LEA 计算的一部分。3 个输入的成本必然高于 ADD 所需的 2 个输入。

在某些机器上,ALU 只能执行 2 个输入操作。因此,LEA 只能在 AGU 上执行,特别是用于加载的 AGU(因为存储 ALU 不写入寄存器)。这可能意味着您不能在加载的同时执行 LEA,或同时执行两个 LEA,而您可以在同一周期中执行两个添加和一个加载。

在其他机器上,LEA 可以由一个、两个或三个 ALU 完成。可能代替 AGU - 可能和 ALU 一样。这证明了更大的灵活性。

或者,简单的 LEA,例如 reg scale+offset,可以在 ALU 上完成,而最大的 LEA,例如 breg+ireg scale+offset,可能会受到限制,甚至可能被分成两个 uop。

所以,问题归结为:哪个欧盟(执行单位)处理哪些 LEA?ALU 还是 AGU?答案取决于机器。

优化指南中的通用文本可能只是说“EU”而不是“AGU 或 ALU,具体取决于模型”或“任何 EU 能够处理该特定 LEA”。

  • 不,彼得,我没有涉及共享启动端口和完成端口的专用 EU 组的复杂性,更不用说 RF 读写端口、灵活的延迟等。在英特尔编译器编写者指南中解释这些问题已经够难的了,当我在 1994 年左右为 P6 编写第一个版本时。太难适应 stackoverflow 的 fitmaf 和原始格式。 (2认同)