RISC V手册混乱:指令格式VS立即格式

时间:2018-07-06 17:37:27

标签: cpu-architecture riscv

我对RISC V手册有一些疑问 它具有不同类型的指令编码,例如R型,I型。 就像MIPS编码一样。

* R-type

  31        25 24     20 19     15 14  12 11      7 6           0
 +------------+---------+---------+------+---------+-------------+
 | funct7     | rs2     | rs1     |funct3| rd      | opcode      |
 +------------+---------+---------+------+---------+-------------+

* I-type

  31                  20 19     15 14  12 11      7 6           0
 +----------------------+---------+------+---------+-------------+
 | imm                  | rs1     |funct3| rd      | opcode      |
 +----------------------+---------+------+---------+-------------+

* S-type

  31        25 24     20 19     15 14  12 11      7 6           0
 +------------+---------+---------+------+---------+-------------+
 | imm        | rs2     | rs1     |funct3| imm     | opcode      |
 +------------+---------+---------+------+---------+-------------+

* U-type

  31                                      11      7 6           0
 +---------------------------------------+---------+-------------+
 | imm                                   | rd      | opcode      |
 +---------------------------------------+---------+-------------+

但是它也有一种叫做立即格式的东西:   例如I级,S级等

* I-immediate

  31                                        10        5 4     1  0
 +-----------------------------------------+-----------+-------+--+
 |                                  <-- 31 | 30:25     | 24:21 |20|
 +-----------------------------------------+-----------+-------+--+

* S-immediate

  31                                        10        5 4     1  0
 +-----------------------------------------+-----------+-------+--+
 |                                  <-- 31 | 30:25     | 11:8  |7 |
 +-----------------------------------------+-----------+-------+--+

* B-immediate

  31                                  12 11 10        5 4     1  0
 +--------------------------------------+--+-----------+-------+--+
 |                               <-- 31 |7 | 30:25     | 11:8  |z |
 +--------------------------------------+--+-----------+-------+--+

* U-immediate

  31 30               20 19           12 11                      0
 +--+-------------------+---------------+-------------------------+
 |31| 30:20             | 19:12         |                   <-- z |
 +--+-------------------+---------------+-------------------------+

* J-immediate

  31                  20 19           12 11 10        5 4     1  0
 +----------------------+---------------+--+-----------+-------+--+
 |               <-- 31 | 19:12         |20| 30:25     | 24:21 |z |
 +----------------------+---------------+--+-----------+-------+--+

根据手册,它是由RISC-V指令产生的,但它们之间有什么关系?

立即格式有什么意义?

1 个答案:

答案 0 :(得分:4)

第二组图向您展示如何将立即数级联并符号扩展为32位整数(因此它们可以用作普通32位ALU指令(如addi)的源操作数,需要它们的两个输入都具有相同的大小)。

对于I型指令来说,这是微不足道的,只需对指令字进行算术右移20位,因为只有一个立即数字段,并且它在指令字的顶部是连续的。

对于S型立即指令,指令字中有两个单独的字段:[31:25][11:7],这向您显示它们的顺序是 that ,而不是[11:7, 31:25],并且它们之间没有任何隐含的零。

B型立即指令显然将第7位放在[30:25]的前面,而低位是隐式零。 (因此,结果数始终是偶数)。我认为B型适用于分支机构。

U型也很有趣,用尾随的零填充20位立即数。 lui用于创建32位常量的高位(其余部分由addi提供)。 U型和I型总共有32个立即数并不是巧合。

要访问静态数据,lui可以创建地址的高位,而lw可以直接提供地址的低位,而不是使用addi在地址中创建完整地址。寄存器。这对于MIPS和PowerPC等RISC ISA也很典型(请参见示例on the Godbolt compiler explorer)。但是与大多数其他RISC ISA不同,RISC-V具有auipc which adds the U-type immediate to the program counter,用于高效PIC,而不必从GOT(全局偏移表)中加载地址。 (最近的MIPS修订版还增加了PC指令,但是很长一段时间以来,MIPS在PIC上都是很糟糕的。)

lui可以对任何4k对齐的地址进行编码,即具有4k页的页面起始地址。