为什么MIPS包含shmt和区分功能/操作码?


15

对于MIPS设计器为何要包含5个专用于移位的位并具有独立的操作码和功能位,我感到困惑。

因为MIPS是RISC,所以我假设只有几条指令才能完成移位操作,所以这5位看起来很浪费空间,因为它们可以立即放入。我假设操作码和函数是分开的,以区分R型和I型指令,但这可以通过将操作码扩展1位来完成。使用这两种R型指令时,它们的长度可能为22位。如果I型和J型指令希望保留其立即数和地址,则此方法将无效,但看起来两者都是不必要的。

Answers:


10

这里有一些不同的权衡。

首先,我们希望指令为固定宽度(32位)。这保证了指令是缓存块和页面对齐的,从而简化了缓存和页面的存在以及权限检查。

其次,我们希望各种指令字段(opcode/ source regs/ immediates)的宽度和位置固定。这使它们解码的逻辑更快/更少,并且在管道的早期阶段就需要它们。(destination直到流水线的末尾才需要寄存器,因此它可以位于指令RI指令的不同位置。)function字段的位置和宽度的重要性要小一些,因为这需要控制ALU的功能,但这是在第三阶段,因此如果需要,您有一​​点时间来使用它。

但是现在,在可能的指令数量和立即数的大小之间我们之间存在紧张关系。我们希望IJ指令中的立即数尽可能长。这是32位架构,J指令只有26位地址。它被添加了两个零低阶位(固定宽度指令的另一个好处),但是您仍然只能跳出字节的最大距离,这对于链接器来说很难。(距离超过2 28个字节的过程的调用需要使用三重指令来完成:立即加载,立即添加,跳转和链接寄存器,而不仅仅是跳转和链接。)16位立即数228228I指令对于编译器/链接器编写者也很好。(在SPARC的立即数字段只有12位的情况下,他们必须添加具有load-high20位立即数的整个特殊指令类。)

因此,我们确实不希望将操作码设置为7位(因为它将切入立即数),但是对于6位,我们只有可能的不同指令,这太少了。折衷方案是:恰好有两种类型的指令(跳转和跳转和链接),只有一种或两种类型的指令,其余的60左右操作码用于指令。26=64JRI

但这给R指令留了一些摆动的空间。除了6位操作码之外,这些寄存器仅需要15个附加位来指定寄存器,从而为扩展操作码和/或移位量保留11位。

您应该将function字段视为R指令的扩展操作码。这里只有一个R指令操作码,但也有64个不同functionsR指令可以执行。

好的。我们有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与MOS 6502进行比较很有趣,因为如果我正确地理解它,那么6502绝对不会残缺(我仍在尝试理解指令格式)。
qwr 2014年

1
6502是第一代微处理器设计(CISC之前的版本),尽管它确实预期会进行流水线设计,因为它可以在加载下一条指令的同时进行寄存器写回。6502具有字节操作码,就像大多数8位微控制器一样。要考虑的另一种体系结构是ARM,它是由一群高级电子工程师设计的,这些工程师阅读了Berkeley RISC论文并访问了MOS工厂并决定“嘿,我们可以做到”。
别名2014年

我想知道如果有一个短位模式意味着“不要执行下面的指令,而是使用为它取来的32位作为该指令的源操作数”,那将意味着什么?作为替代或补充,我想知道有大量的操作码空间专用于成对的简单不间断指令是否可行,这个概念有点像Thumb,但是可以自由地散布在32位指令上,并且没有能力直接跳转到单词的第二个指令?
超级猫

5

要了解MIPS I指令格式,您需要了解MIPS管道,还需要回想一下大约1985年的CPU实现技术。在IF之后的ID阶段。

出于R型指令的目的,ID阶段需要执行以下任务:

  1. 确定它实际上 R型指令。
  2. 如果是这样,请告诉寄存器文件从寄存器中加载值。

出于讨论的目的,这是您首先要考虑的任务。如果您需要做很多指令解码工作,甚至需要从寄存器中获取任何值,那么这会增加延迟,您才可以开始读取寄存器。这也增加了ID阶段的复杂性。通过为所有R型指令保留单个操作码,可以将复杂性降至最低。

您仅将五位用于移位就显得有些奇怪。我可以想到一些可能的解释。其一是它简化了路由选择(这五位总是被直接馈入寄存器文件,那五位总是被馈入桶形移位器,那六位总是被路由到ALU以确定要执行的功能)。

他们可能已经在考虑将来引入左移和加左的组合指令。大概是这样的形式:

$d = $s + ($t << shamt)

2s+1s

今天,对于更复杂的解码阶段,我们可能会三思而后行,尤其是因为寄存器文件访问往往会在典型的超标量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年,它的时钟周期很多。

从地址字段中窃取一点将进一步减小直接跳转的有效范围。您可以看到这可能太高了,无法支付。


后来在ARM中看到的那种类型的“组合左移和添加指令”?
Damian Yerrick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.