Answers:
这里有一些不同的权衡。
首先,我们希望指令为固定宽度(32位)。这保证了指令是缓存块和页面对齐的,从而简化了缓存和页面的存在以及权限检查。
其次,我们希望各种指令字段(opcode
/ source regs
/ immediates
)的宽度和位置固定。这使它们解码的逻辑更快/更少,并且在管道的早期阶段就需要它们。(destination
直到流水线的末尾才需要寄存器,因此它可以位于指令R
和I
指令的不同位置。)function
字段的位置和宽度的重要性要小一些,因为这需要控制ALU的功能,但这是在第三阶段,因此如果需要,您有一点时间来使用它。
但是现在,在可能的指令数量和立即数的大小之间我们之间存在紧张关系。我们希望I
和J
指令中的立即数尽可能长。这是32位架构,J
指令只有26位地址。它被添加了两个零低阶位(固定宽度指令的另一个好处),但是您仍然只能跳出字节的最大距离,这对于链接器来说很难。(距离超过2 28个字节的过程的调用需要使用三重指令来完成:立即加载,立即添加,跳转和链接寄存器,而不仅仅是跳转和链接。)16位立即数I
指令对于编译器/链接器编写者也很好。(在SPARC的立即数字段只有12位的情况下,他们必须添加具有load-high
20位立即数的整个特殊指令类。)
因此,我们确实不希望将操作码设置为7位(因为它将切入立即数),但是对于6位,我们只有可能的不同指令,这太少了。折衷方案是:恰好有两种类型的指令(跳转和跳转和链接),只有一种或两种类型的指令,其余的60左右操作码用于指令。J
R
I
但这给R
指令留了一些摆动的空间。除了6位操作码之外,这些寄存器仅需要15个附加位来指定寄存器,从而为扩展操作码和/或移位量保留11位。
您应该将function
字段视为R
指令的扩展操作码。这里只有一个R
指令操作码,但也有64个不同functions
的R
指令可以执行。
好的。我们有60种不同的I
指令和64种不同的R
指令,那么我们应该将立即移位指令放在哪里?
好吧,不仅I
指令减少了,而且我们想用I
指令做更多的事情。回想一下,所有分支指令都必须是I
指令,因为它们具有相对(立即)偏移量。同样,所有加载和存储指令均I
在MIPS 上格式化。最后,我们需要将上载立即指令作为一条I
指令。不仅如此,R
指令还有5个额外的未使用位(这是我们在该体系结构上立即执行移位即时处理所需要的),因此这进一步鼓励了将移位即时处理转换为特殊(怪异)R
指令。
这些决定中的许多决定比艺术更具有艺术性,但是可以辨别出潜在的逻辑。关键目标不是使指令数量尽可能少,而是使高性能流水线安装在单个芯片上(这样MIPS和Sun这样的小公司可以在1980年代与IBM和DEC竞争)。(由David Patterson发明的RISC这个名字有些不幸。它之所以流行是因为它很可爱,而不是因为“精简指令”是对MIPS和SPARC体系结构真正尝试做的事情的准确描述。)因此,您想要指令具有固定宽度(并且相对较小,这样您可以获得更好的I-cache行为),从而使提取,分页和解码变得更加简单和快捷。您希望指令中需要提前解码的部分(opcode
,两个源寄存器和带符号扩展的立即数)为固定宽度并位于固定位置。您希望立即数尽可能长,并且在考虑到所有其他约束的情况下,您需要尽可能多的不同种类的指令。
要了解MIPS I指令格式,您需要了解MIPS管道,还需要回想一下大约1985年的CPU实现技术。在IF之后的ID阶段。
出于R型指令的目的,ID阶段需要执行以下任务:
出于讨论的目的,这是您首先要考虑的任务。如果您需要做很多指令解码工作,甚至需要从寄存器中获取任何值,那么这会增加延迟,您才可以开始读取寄存器。这也增加了ID阶段的复杂性。通过为所有R型指令保留单个操作码,可以将复杂性降至最低。
您仅将五位用于移位就显得有些奇怪。我可以想到一些可能的解释。其一是它简化了路由选择(这五位总是被直接馈入寄存器文件,那五位总是被馈入桶形移位器,那六位总是被路由到ALU以确定要执行的功能)。
他们可能已经在考虑将来引入左移和加左的组合指令。大概是这样的形式:
$d = $s + ($t << shamt)
今天,对于更复杂的解码阶段,我们可能会三思而后行,尤其是因为寄存器文件访问往往会在典型的超标量CPU的管线中稍后发生。许多现代CPU甚至在将指令插入L1高速缓存时都会执行一些粗略的指令解码。您将I高速缓存行的宽度扩大了几位,以存储额外的信息(由于摩尔定律,您浪费了许多晶体管),从而使“适当的”指令解码更加简单快捷。
他们可能希望将操作码字段保持尽可能小的原因之一是,它不会对J类型的指令造成不利影响。您可能知道,J型指令使用伪直接寻址。为了大家在家里玩耍的好处,我将简要解释一下。
J型指令的地址字段为26位。由于指令始终是4字节对齐的,因此您不需要存储最低有效两位,这意味着您实际上拥有28位地址。但是,MIPS I中的地址空间是32位。因此,跳转位置的高四位取自程序计数器。
这意味着您不能直接跳转到PC位置的最高四位不同的位置。您将不得不通过暂存寄存器执行更昂贵的三指令跳转:
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
今天还算不错,但是在1985年,它的时钟周期很多。
从地址字段中窃取一点将进一步减小直接跳转的有效范围。您可以看到这可能太高了,无法支付。