【问题标题】:RISC V manual confusion: instruction format VS immediate formatRISC V手动混淆:指令格式VS立即格式
【发布时间】:2018-12-15 08:32:03
【问题描述】:

我有一些关于 RISC V 手册的问题 它具有不同类型的指令编码,例如R-type,I-type。 就像 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 指令产生的,但它们是如何相关的?

立即格式化有什么意义?

【问题讨论】:

  • I-U-S-B-immediate 格式不是指令格式 - 而是,正如 Peter Cordes 所解释的 - 如何在每种指令格式中对立即数进行编码。

标签: cpu-architecture riscv


【解决方案1】:

第二组图表向您展示了如何将立即位连接并符号扩展为 32 位整数(因此它们可以作为普通 32 位 ALU 指令的源操作数,例如 addi 需要两者它们的输入大小相同)。

对于 I 型指令,这很简单,只需将指令字算术右移 20 位,因为只有一个立即字段,并且在指令字的顶部是连续的。

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

B 型立即数指令显然将第 7 位放在 [30:25] 前面,而低位是隐式零。 (所以结果数总是偶数)。我假设 B 型用于分支。

U 型也很有趣,用尾随零填充 20 位立即数。它用于 lui 创建 32 位常量的高位(addi 提供其余部分)。 U-type 和 I-type 总共有 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 修订版还添加了一个 add-to-PC 指令,但长期以来 MIPS 在 PIC 方面相当糟糕)。

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

【讨论】:

  • 请问为什么需要将立即位扩展成32位?是不是因为立即数被解码成 32 位,以便与寄存器中的内容保持相同的大小?
  • @Billy:像add r0, r1, 1234 这样的指令(或任何 RISC-V 的语法)正在执行 32 位加法,因此两个输入的大小必须相同。因此立即数需要一个规则来扩展寄存器宽度;否则,如果需要,每条指令本身都可以有自己的扩展立即数的规则。 (不过,移位指令不需要关心高位。)顺便说一句,MIPS ori 零扩展立即数,而 MIPS addiu 符号扩展。 IDK 如果 RISC-V 有任何重新解释立即覆盖一般规则的指令。
  • U型是干什么用的:用来加载寄存器的高位。通常与提供剩余位的 I 型或 S 型配对。例如,要将 0x12345678 添加到寄存器中,您将 lui rt, 0x12345(U 型)设置 rt = 0x12345000,然后设置 addi rd, rt, 0x678(I 型)以完成工作。同样,要对0x12345678 执行绝对存储,您将使用sw rs, 0x678(rt)(S 类型)。
  • @RaymondChen:谢谢;这很有意义。我更熟悉 MIPS,它有 16 位立即数;我认为 MIPS lui 只是使用与其他指令相同的 I 型格式。 (允许在 2 条指令中创建任意 32 位常量)。由于 RISC-V 的 I 型指令的立即数较小,因此在 lui 上使用足够的编码空间仍然可以在 2 条指令中获得总共 32 个立即数位。
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 2023-03-22
  • 1970-01-01
  • 2017-03-13
  • 2017-01-18
  • 1970-01-01
  • 2020-07-26
  • 2021-06-17
相关资源
最近更新 更多