12. 前缀(PPlain和PMMX)

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

有前缀的指令可能无法在V-管道执行 (见第10章,第7部分), 并且它的解码时间多于一个周期。

在 PPlain 上,除了条件近跳转的0FH前缀外,每个前缀的解码时间是一个时钟周期。

PMMX 对于0FH前缀没有解码延迟。 段前缀和重复前缀用 1 个时钟周期来解码。 地址尺寸和操作数尺寸前缀用 2
个周期来解码。 在 PMMX 上,如果两条指令中第一条有一个段前缀或重复前缀或没有前缀,第二条没有前缀,那么它能在一个周期内解码这两条指令。

有地址尺寸或操作数尺寸前缀的指令在PMMX上只能被单独解码。 多于一个前缀的指令,每个前缀化1个周期解码。

在32位模式下,地址尺寸前缀可以不用;

用了平坦内存模式后,段前缀也能不用; 如果只用8位和32位整型的话,操作数尺寸前缀也能不用。

在前缀不可避免情况下,如果前面的指令执行时间超过一个时钟周期的话,那么解码延迟可能被掩盖。

PPlain 的规则是,任何执行时间(不包括解码)为N个时钟周期的指令可以掩盖下两条(有时是三条)指令或指令对里N-1个前缀的解码延迟。

换句话说,用于执行指令的每个时钟周期,都可以用来解码后续指令的一个前缀。 "阴影效应"对于被正确预测的分支也有效。

任何执行时间超过一个时钟周期的指令,以及任何因为AGI效应、cache不命中、数据没对齐等等理由的延迟(除了解码延迟和分支预测失败),它们都有"阴影效应"。

PMMX也有“阴影效应”,但是机制更先进。

已经解码完毕的指令被存在一个对用户透明的先进先出(FIFO)的缓存里面,该缓存能存4条指令。取缓存中的指令没有延迟。一旦指令解码完毕开始执行,就被抛出缓存。

当指令的执行速度慢于指令的解码速度时,缓存会填满——也就是当你有未配对的指令或多时钟的指令时。
当指令的执行速度大于解码速度时,缓存会空出——也就是当你有因为前缀缘故的解码延迟。 在分支预测失败的时候,缓存被清洗。

在第2条指令没有前缀且没有一条指令的长度超过7个字节的前提下,指令cache在一个时钟周期内可以放入两条指令,U、V两个流水线可以在一个时钟周期内各接受其中的一条指令去执行。

比如:

CLD REP MOVSD

CLD指令花两个时钟周期,因此掩盖了REP前缀的解码延迟。如果 CLD 远离 REP MOVSD 的话,这片代码将花不止一个周期。

CMP DWORD
PTR [EBX],0 / MOV EAX,0/SETNZ AL

由于CMP指令是一条读/写指令,因此花两个周期。在CMP的两个周期中,SETNZ指令的前缀0FH被解码,因此在PPlain机上,解码延迟被掩盖了(在PMMX上没这个问题,因为它对0FH前缀没有解码延迟)。

在 PPro,PII,PIII 机上的前缀的副作用,在14章描述。