为什么操作码在 MIPS 32 位架构中是 6 位长

Why opcode is 6-bit long in MIPS 32 bit Architecture

下面是32位ARM和MIPS架构的数据传输指令格式。 32 位 ARM 架构有 4 位操作码,因为有 16 个寄存器(2^4=16)。32 位 MIPS 架构有 6 位操作码。考虑到 MIPS 中有 32 个寄存器,它不应该是 5 位吗?

寄存器的数量与操作码位数无关,它与支持的指令数量有关(考虑到存在指令前缀等技术,这仍然不是硬性限制因素)。

另一方面,操作数位数(图中的Rs和Rd)与寄存器的数量有关(它们是5位,因为MIPS有32个寄存器,2^5 = 32)。

因此,拥有 6 位操作码意味着您最多可以编码 2^6=64 条不同的指令,这些指令可以在单个解码周期中解释。

操作码编码和寄存器字段编码和immediate/const编码是不同的,它们之间有不同的权衡,因为当它们必须在同一条指令中co-exist时,使一个变大使另一个变小.

每个字段的大小决定了该字段中可以表示的不同项目的数量。

与 MIPS 相比,例如 RISC V,将 I-type 指令中的“const”立即字段缩短为 12 位,这允许更大的操作码字段——基本指令集操作码字段中的 7 位, 加上 func 中的 3 个额外位(字段通常也是相反的,从右到左):

+-------------------------------------------+
| imm:12 | rs1:5 | func:3 | rd:5 | opcode:7 |    I-Type
+-------------------------------------------+

这些额外的操作码位用于:

  • 处理不同长度的指令,RISC V 允许的大小为:
    • 16位压缩指令,可以混用
    • 32 位,用于 32 位和 64 位处理器
    • 48 位及更大(目前还没有标准化的扩展)
  • 用于指令集的寿命和进化
    • 随着时间的推移,添加了说明,但很少删除以保持落后 兼容性
  • 扩展指令集以满足应用程序和设备的特定需求
    • 在嵌入式使用中可能会发生这种情况,其中进行的扩展从未打算包含在官方规范中