我正在阅读 P&H 的 Computer Organization and Design 并遇到以下行:“在 x86 这样的指令集中,指令从 1 字节到 17 字节不等,流水线更具挑战性”,其中比较是在 x86 和MIPS。
更长的指令是否必须编码更多的操作?如果是这种情况,有人可以解释为什么吗?似乎这就是这里建立的联系,但似乎可以开发一条具有大立即数或偏移量的指令,该指令占用大量字节,但仅包含单个操作。如果不是这种情况,有人可以解释这个说法吗?
我正在阅读 P&H 的 Computer Organization and Design 并遇到以下行:“在 x86 这样的指令集中,指令从 1 字节到 17 字节不等,流水线更具挑战性”,其中比较是在 x86 和MIPS。
更长的指令是否必须编码更多的操作?如果是这种情况,有人可以解释为什么吗?似乎这就是这里建立的联系,但似乎可以开发一条具有大立即数或偏移量的指令,该指令占用大量字节,但仅包含单个操作。如果不是这种情况,有人可以解释这个说法吗?
该陈述有些不准确(如果设计得当,我看不出变长指令集应该更难流水线的先验原因),但可能指的是在 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 指令的预感是正确的!