从微体系结构中提取的x86程序计数器?

从微体系结构中提取的x86程序计数器?,x86,cpu-architecture,riscv,instruction-set,program-counter,X86,Cpu Architecture,Riscv,Instruction Set,Program Counter,我正在读《RISC-V阅读器:开放式体系结构地图集》。为了解释ISA(指令集体系结构)与特定实现(即微体系结构)的隔离,作者写道: 架构师的诱惑是在ISA中包含指令,这些指令有助于在特定时间实现一个实现的性能或成本,但会给不同的或未来的实现带来负担 据我所知,它指出在设计ISA时,理想情况下ISA应该避免暴露实现它的特定微体系结构的细节 记住上面的引文:当涉及RISC-V ISA上的程序计数器时,程序计数器(pc)指向当前执行的指令。另一方面,在x86 ISA上,程序计数器(eip)不包含当前

我正在读《RISC-V阅读器:开放式体系结构地图集》。为了解释ISA(指令集体系结构)与特定实现(即微体系结构)的隔离,作者写道:

架构师的诱惑是在ISA中包含指令,这些指令有助于在特定时间实现一个实现的性能或成本,但会给不同的或未来的实现带来负担

据我所知,它指出在设计ISA时,理想情况下ISA应该避免暴露实现它的特定微体系结构的细节


记住上面的引文:当涉及RISC-V ISA上的程序计数器时,程序计数器(
pc
)指向当前执行的指令。另一方面,在x86 ISA上,程序计数器(
eip
)不包含当前正在执行的指令的地址,而是包含当前指令之后的指令的地址


x86程序计数器是从微体系结构中抽象出来的吗?

我将用MIPS而不是x86来回答这个问题,因为(1)MIPS和x86在这方面有相似之处,并且(2)RISC V是Patterson等人在数十年的MIPS经验后开发的。我觉得他们书中的这些语句在这个比较中最容易理解,因为x86和MIPS都编码相对于指令末尾的分支偏移量(MIPS中的pc+4)

在MIPS和x86中,PC相对寻址模式仅在早期ISA版本的分支中找到。更高版本增加了PC相对地址计算(例如,MIPS
auipc
或x86-64的RIP相对寻址模式用于LEA或加载/存储)。这些都是相互一致的:偏移量是相对于(过去一次)指令结束(即下一个指令开始)进行编码的,而正如您所注意到的,在RISC V中,编码的分支偏移量(和auipc等)是相对于指令开始的

这样做的价值在于它从某些数据路径中删除了一个加法器,有时这些数据路径中的一个可能位于关键路径上,因此对于某些实现来说,数据路径的微小缩短意味着更高的时钟速率

(当然,RISC V仍然必须为pc next生成指令+4和调用指令的返回地址,但在关键路径上这要少得多。请注意,在下图中,两者都没有显示pc+4作为返回地址的捕获。)


让我们比较一下硬件框图:

MIPS数据路径(简化)


RISC V数据路径(简化)

您可以在RISC V数据路径图上看到标记为#5(红色,就在控制椭圆上方)的线绕过加法器(#4,它将4添加到pc中,用于pc下一步)


图表的属性

  • MIPS:
  • RISC V:

为什么x86/MIPS在最初的版本中做出了不同的选择?

当然,我不能肯定。在我看来,这是一个选择,对于最早的实现来说并不重要,所以他们可能甚至没有意识到潜在的问题。几乎每一条指令都需要计算下一条指令,所以这似乎是一个合乎逻辑的选择

充其量,他们可能节省了几根电线,因为其他指令(如call)确实需要pc next,否则不一定需要pc+0

对先前处理器的检查可能会表明,这正是当时的做法,因此这可能更多地是对现有方法的继承,而不是设计选择

8086不是流水线(指令预取缓冲区除外),可变长度解码在指令开始执行之前已经找到了指令的结尾

经过多年的事后思考,这个数据路径问题现在在RISC V中得到了解决

我怀疑他们在这方面做出了与分支延迟时隙(MIP)相同的有意识的决定


根据注释中的讨论,8086可能没有任何推送指令开始地址的异常。与后来的x86机型不同,divide异常将指令地址推送到div/idiv之后。在8086中,
cs rep movsb
(或其他字符串指令)推送最后一个前缀(而不是包括多个前缀的整个指令)的地址后,中断恢复。此“错误”在中有记录。所以很可能8086并没有记录指令的起始地址或长度,只记录在开始执行之前解码完成的地址。这可能是186,但适用于所有8086/8088 CPU

MIPS从一开始就有虚拟内存,因此它确实需要能够记录出错指令的地址,以便在异常返回后可以重新运行。此外,软件TLB未命中处理还需要重新运行故障指令。但是异常速度很慢,并且无论如何都会刷新管道,并且在获取之后很长时间才会被检测到,因此不管怎样,可能都需要进行一些计算

据我所知,它指出在设计ISA时 理想情况下,应避免暴露某一特定事件的细节 实现它的微体系结构

如果你对理想ISA的衡量标准是简单,那么我可能同意你的看法。但在某些情况下,通过ISA暴露微体系结构的某些特征以提高性能是有益的,并且有一些方法可以使这样做的负担可以忽略不计。例如,考虑x86中的软件预取指令。这些指令的行为在体系结构上定义为微体系结构相关。英特尔甚至可以在未来设计一种微体系结构,在这种体系结构中,这些指令在没有vi的情况下表现为无操作