9. 地址生成互锁(AGI) (PPlain and PMMX)

优质
小牛编辑
128浏览
2023-12-01

指令操作内存所需要的地址需要一个时钟周期来计算。 通常在前面的指令或指令对执行的时候,它已经在流水线通过一个独立的阶段上计算好了。 但是如果地址的计算倚赖上个时钟周期的运行结果的话,你就需要一个额外时钟周期来等待地址的计算。 这就叫做AGI延迟。 例如:
ADD EBX,4 / MOV EAX,[EBX] ; AGI 延迟
例子里的延迟可以向 ADD EBX,4 and MOV EAX,[EBX] 间增加一些其它的指令或者重新写成 MOV EAX,[EBX+4] / ADD EBX,4 来去掉。
当你隐性的使用ESP寻址, 比如 PUSH, POP, CALL, and RET, 且 ESP 在前个周期被MOV, ADD 或 SUB 等修改,这样也会造成AGI延迟。 PPlain 及 PMMX 有专门的电路来预测栈操作后的ESP值, 因此你在用PUSH, POP, 或 CALL 改变 ESP 后不会遇到AGI延迟。 在 RET 后面, 仅仅在有立即操作数对ESP做加法时才会产生AGI延迟。

例如:

ADD ESP,4 / POP ESI ; AGI 延迟
POP EAX / POP ESI ; 无延迟, 配对
MOV ESP,EBP / RET ; AGI 延迟
CALL L1 / L1: MOV EAX,[ESP+8] ; 无延迟
RET / POP EAX ; 无延迟
RET 8 / POP EAX ; AGI 延迟

当 LEA 指令使用了基寄存器或索引寄存器, 而它们在前面的时钟周期被改变了,同样会发生AGI延迟。 例如:

INC ESI / LEA EAX,[EBX+4*ESI] ; AGI 延迟

PPro, PII 和 PIII 在读内存和LEA上没有 AGI 延迟, 但是在写内存时会有 AGI 延迟。 如果后来的代码不需要等待写操作结束的话这并无大影响。