A modern superscalar out-of-order x86 associates an EIP (or RIP) with each in-flight instruction (or maybe each uop ;但是多uop指令将所有uop相互关联,因此指令不能部分退出 . )
与架构状态的其他部分(例如EFLAGS,EAX等)不同,该值在解码后是静态已知的 . 实际上甚至比直接 Value 更早;在预解码阶段(或在L1i高速缓存中标记)检测指令边界,以便可以将多个指令并行地馈送到多个解码器 .
早期的提取/解码阶段可能只跟踪16字节或32字节提取块的地址,但在解码之后我假设有需要它的's an address field in the internal uop representation. It might just be a small offset from the previous (to save space) for non-branch instructions, so if it'可以计算,但我们在这里深入了解实现细节 . 乱序执行保持了在程序顺序中运行的指令的错觉,并且它们按顺序发出和退出(进入/离开核心的无序执行部分) .
1 回答
您似乎假设只有一个物理EIP寄存器被整个CPU内核使用 .
这不起作用,因为每个可能发生异常的指令都需要知道自己的地址 . 或者当外部中断到来时,CPU可以决定在任何指令之后服务中断,使其成为架构EIP . 在长模式(x86-64)中,还有RIP相对寻址模式,因此
call
不是唯一需要当前程序计数器作为数据的指令 .一个简单的流水线CPU可能为每个管道阶段都有一个EIP .
A modern superscalar out-of-order x86 associates an EIP (or RIP) with each in-flight instruction (or maybe each uop ;但是多uop指令将所有uop相互关联,因此指令不能部分退出 . )
与架构状态的其他部分(例如EFLAGS,EAX等)不同,该值在解码后是静态已知的 . 实际上甚至比直接 Value 更早;在预解码阶段(或在L1i高速缓存中标记)检测指令边界,以便可以将多个指令并行地馈送到多个解码器 .
早期的提取/解码阶段可能只跟踪16字节或32字节提取块的地址,但在解码之后我假设有需要它的's an address field in the internal uop representation. It might just be a small offset from the previous (to save space) for non-branch instructions, so if it'可以计算,但我们在这里深入了解实现细节 . 乱序执行保持了在程序顺序中运行的指令的错觉,并且它们按顺序发出和退出(进入/离开核心的无序执行部分) .
相关:基于查看玩具CPU,x86 registers: MBR/MDR and instruction registers做出了类似的错误假设 . 没有"current instruction"寄存器保存机器代码字节 . 有关OoO /流水线CPU的更多信息,请参阅我的答案中的更多链接 .
在块被解码之前,分支预测必须工作 . 即假设我们刚刚在地址abc处获取了一个块,我们需要预测下一个要获取的块 . 即预测必须预测将并行解码的16字节指令块中跳跃的存在 .
相关:Why did Intel change the static branch prediction mechanism over these years?