X86 JMP指令如何影响8086';他在工作吗?

X86 JMP指令如何影响8086';他在工作吗?,x86,cpu-architecture,x86-16,machine-language,X86,Cpu Architecture,X86 16,Machine Language,我知道8086有一个BIU和一个EU,这有助于处理器的流水线。BIU有一个6字节的预取队列,用于获取指令指针指向的地址后面的字节。现在,当要执行的指令被证明是到另一个位置的跳转指令时,预取的所有6字节会发生什么情况?他们会被冲水然后重新装填吗?(这会破坏处理器的流水线效率,不是吗?是的,8086和更高版本的微体系结构中的指令预取队列也同样工作。任何控制传输以空缓冲区开始后的指令提取 对于JIT/自修改代码,这意味着任何跳转都足以避免陈旧的指令获取 他们会被冲水然后重新装填吗? 这会破坏处理器的流

我知道8086有一个BIU和一个EU,这有助于处理器的流水线。BIU有一个6字节的预取队列,用于获取指令指针指向的地址后面的字节。现在,当要执行的指令被证明是到另一个位置的跳转指令时,预取的所有6字节会发生什么情况?他们会被冲水然后重新装填吗?(这会破坏处理器的流水线效率,不是吗?

是的,8086和更高版本的微体系结构中的指令预取队列也同样工作。任何控制传输以空缓冲区开始后的指令提取

对于JIT/自修改代码,这意味着任何跳转都足以避免陈旧的指令获取

他们会被冲水然后重新装填吗? 这会破坏处理器的流水线效率,不是吗

缓冲区中的指令来自错误路径,除非它是
jmp+0
nop。所以它们没有重新加载;它们是无用的,必须加载正确的路径

这不太好,而且是跳跃的额外成本这就是为什么以后像奔腾这样的CPU会有分支预测,这样它们就可以在跳转偶数解码之前从正确的路径获取数据。(分支预测需要预测分支的存在,例如,给定获取块地址,预测下一步获取哪个块,以及预测条件分支的走向。)

8086几乎不像5级RISC那样是一条高效的管道

无论如何,指令提取通常是8086上的主要瓶颈,因此在大多数跳转中,缓冲区可能不会满。您最多只会损失6个字节(3个字提取)的浪费预提取工作,而且可能会更少。(这就是为什么在8086上优化速度在很大程度上优化了代码大小,只是避免了一些像乘法这样的慢指令。这也是为什么x86的紧凑可变长度指令是8086的好设计。)

我不知道跳转解码/执行需要多长时间,但跳转的长度是2或3字节(在x86-16中),对于带有操作码+modrm+disp16+可选前缀的间接跳转,甚至是4+。刚刚执行的跳转指令可能会在8086上留下接近空的预取缓冲区


从形式上讲,x86 ISA至少曾经要求使用诸如
iret
cpuid
之类的串行化指令,以避免任何过时指令的风险。但为了避免破坏现有代码,真正的x86 CPU所需的时间都不超过跳线1

具有分支预测+推测性执行功能的现代OoO x86 CPU(如P6系列)不需要任何东西;它们积极地嗅探管道以检测与飞行指令重叠的存储


脚注1:多年来,x86中经常出现超越纸面规格以保持与广泛使用的软件的兼容性;真正的向后兼容性和二进制兼容性基本上是x86与更干净的RISC ISA的主要卖点,直到x86占据主导地位,以至于其他ISA放弃瞄准高功率/高性能的m市场(多亏晶体管预算的不断增长和巧妙的设计理念,才有可能支付“x86税”,而且运行速度仍然很快

如果一个新的更快的CPU不能运行现有版本的DOS、Windows、Lotus Notes或其他任何东西,市场将面临巨大阻力