我对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指令产生的,但它们之间有什么关系?
立即格式有什么意义?
答案 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页的页面起始地址。