【问题标题】:Complex Instructions and Pipelining复杂的指令和流水线
【发布时间】:2013-11-22 10:05:45
【问题描述】:
我正在阅读 P&H 的 Computer Organization and Design 并遇到以下行:“在 x86 这样的指令集中,指令从 1 字节到 17 字节不等,流水线更具挑战性”,其中进行的比较是在 x86 和 MIPS 之间。
更长的指令是否一定要编码更多的操作?如果是这种情况,有人可以解释为什么吗?似乎这就是这里建立的联系,但似乎可以开发一条具有大立即数或偏移量的指令,该指令占用大量字节,但仅包含单个操作。如果不是这种情况,有人可以解释一下这个说法吗?
【问题讨论】:
标签:
architecture
x86
mips
instructions
instruction-set
【解决方案1】:
该陈述有些不准确(如果设计得当,我看不出变长指令集应该更难流水线的先验原因),但可能指的是在 MIPS 中,指令是固定长度的,4字节;而在 x86 中,指令的长度最多可以从 1 字节变化到 15 字节(17 字节不正确),这使得管道中的 解码 步骤更加复杂。
由于指令长度不同,在 x86 中发现指令边界要困难得多,因为当前指令必须在 CPU 知道下一条从哪里开始、下一条、下一条等之前解码。在 MIPS 中另一方面,保证,+4 增量是您进入下一条指令所需的全部内容(除非您的管道中有分支),而且这些指令也在 4 字节边界上对齐。
该语句可能涉及的另一个问题是,在 x86 中,可以在指令中添加特殊前缀(例如 REX、VEX 和 LOCK)和后缀(SIB)来修改它们的行为,例如授予对更多(r8 -r15) 和更宽 (eax -> rax, XMM -> YMM) 寄存器,更多操作数(VEX 3 和 4 操作数非破坏性存储指令,其中目标寄存器不一定是源寄存器之一) ,锁定系统总线以使操作成为原子操作,或者将比例、索引和基本位移指定为内存操作数。
这些前缀和后缀让生活变得艰难,因为指令集中的这些前缀和后缀越多,它们对指令含义的修改就越多,解码步骤确定要执行的确切内容所需的时间就越长,从哪里提取所有操作数,下一条指令从哪里开始。
较长的指令不一定编码更多的“操作”。您对某些包含大量常量但仍只执行一项“操作”的 x86 指令的预感是正确的!