29. 指令速度及微操作失败列表(PPro,PII和PIII)
注释:
操作数:
r = 寄存器(register), m =
内存(memory), i = 立即数(immediate data), sr = 段寄存器(segment register), m32 =
32位内存操作数(32 bit memory operand),等等。
微码:
指令对各个执行端口产生的微码数
p0: 端口0: ALU,
等等。
p1: 端口1: ALU, 跳转
p01:
指令既能进入端口0也能进入端口1,就看哪个先有空了。
p2: 端口2: 读数据, 等等。
p3: 端口3: 为存数据计算地址
p4: 端口4: 存数据
延迟:
这里的延迟是指指令在依赖链中产生的延迟(这与花在执行单元上的时间不同。
在不能确切测量的情况下,值可能是错误的,尤其对内存操作数)。 给出的值是最小值。 cache失效,未对齐操作,异常都可能会大幅增加时钟数。
在这里,总是假定浮点操作数是规格化的。
除了XMM数据传输指令,洗牌指令和布尔指令外,非规格化数,NAN(包括发信号的和不发信号的),正负无穷大都会导致延迟再增加50-150时钟。
浮点上溢,下溢,非规格化数,NAN导致的延迟与之相似。
吞吐量:
这里的吞吐量是指若干相同指令的最大吞吐量。
比如,FMUL指令的吞吐量为1/2,意味着每2个时钟周期可以开始一条新的FMUL指令。
注:
a) 在特定条件下更快:见26.3节。
b) 见26.1节
c) 如果只有常量,没有基址或变址寄存器的话是3
d)
只有PIII上才能用。
注:
e) 不能流水化
f) FXCH产生1条微码,但它通过寄存器重命名来完成,不需要进入任何端口。
g) FMUL与整型乘法使用同一条电路。 因此,混用浮点和整型乘法的总体吞吐量是每3个时钟1条FMUL+1条IMUL。
h)
FDIV的延迟取决于控制字中指定的精度:64位精度延迟是38,53位精度延迟是32,24位精度延迟是18。 除数是2的幂次的除法花9个时钟。
除法的吞吐量是1/(延迟-1)。
i) 在低精度下更快。
?
注:
d) 只有PIII上才能用。
k) 你可以在EMMS和后续浮点指令之间插入一些其它指令来掩盖延迟。
?