为了解释为什么Bulldozer的表现不佳,我浏览了Agner Fog的优秀微架构书籍,在第178页中有这段话。 可以在一个时钟周期内解码具有多达三个前缀的指令。 带有超过三个前缀的指令会受到非常大的惩罚。 具有4-7个前缀的指令需要额外14-15个时钟周期来解码。 具有8-11个前缀的指令需要额外20-22个时钟周期,具有12-14个前缀的指令需要额外27-28个时钟周期。 因此,不建议使用超过三个前缀使NOP指令变长。 此规则的前缀计数包括操作数大小、地址大小、段、重复、锁定、REX和XOP前缀。 三字节VEX前缀计为一字节,而两字节VEX前缀不计入。 转义代码(0F、0F38、0F3A)不计入。
当我搜索前缀时,我遇到了非常技术性的定义,远远超出了我的能力范围。 或者,建议它们每个指令最多只能有4个前缀,这与上述摘录相冲突。
因此,简单地说,有人可以解释一下前缀是什么,它们是如何工作的,以及为什么你可能希望在一条指令上添加多达14个前缀而不是将其拆分?
当我搜索前缀时,我遇到了非常技术性的定义,远远超出了我的能力范围。 或者,建议它们每个指令最多只能有4个前缀,这与上述摘录相冲突。
因此,简单地说,有人可以解释一下前缀是什么,它们是如何工作的,以及为什么你可能希望在一条指令上添加多达14个前缀而不是将其拆分?
lock inc word [edi + r10d*4]
需要4个前缀:lock op-sz addr-sz REX。 - Peter Cordes