我有一些与 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指令产生的,但是它们之间有什么关系呢?
立即格式有什么意义?
第二组图向您展示了立即数位如何连接并符号扩展为 32 位整数(因此它们可以用作普通 32 位 ALU 指令的源操作数,例如addi
需要它们的输入大小相同)。
对于 I 类型指令,这很简单,只需将指令字算术右移 20 位即可,因为只有一个立即数字段,并且它在指令字的顶部是连续的。
对于S型立即数指令,指令字中有两个独立的字段:[31:25]
and [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 来说也是典型的(参见示例在 Godbolt 编译器资源管理器上 https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAKxAEZSAbAQwDtRkBSAJgCFufSAZ1QBXYskwgA5HhYEA1ADcmxDgGY%2BABgCCHHbIUAqJunTFMgwRACU8jgHYe88wTEs7XAGzLVGu/YARPW0DJSYGEUwbfycXNzDfJwcg/Tl5NBZBAlYCaIdYzFdid00AD3sAMyrMAA5NTXUkwOCpa0ZpAFYpUhZpTW7UaQBhfn55YTEJDzVaboI%2B1raAaxA1NQA6Na3tnc92qQAWbt6pftJBqW7BEE1SedPW0jhYGEQUVABbAAc8BkwyCgQNDfX7/EDERRqLjIZhsUgVX4Ef7XCAAIwWpFRshUAE9pLNSMCPpg5AB5FgMPFSAlYD6sYB/DH4czIAh4RQWDGYUqYZAiJH47oGTAMDEEYh4D6Ctqw9ijXiMPCo66QNqoL5s1CZaQAWlJaiuonEkloMs6xwxFwlgmQkK46Vl8gg4pELCWtgguEIJGm9HkQ0%2BPz%2BxF9thGvH4cwW1mWqw2OwTWz2osO3SlHQ2AE4uGoOgdaFwDvYDjUDpnNHsTmcLlcbndo09XhAkMCg/9yJRW6DiCAvl9kMAS/DEcjKOiHpjscQqQSiSSCOTKUzMHS2IyJ8zeWyOdcJ9zefzJNShXIRWKJVLjzL6Sh5QIGEqVTZzhq8Frd3qDUIjRI6GapF0PSWtIAAKqAAO7/CBQzyMAyDIPIBzrDU6wdE6XpECG3AzKQ/qBt20xqGGd5Rg8MakAgmAmGCz4pkcpBSgcnjrJo9ieAcHQ1PYHRcB0tAdJomYHEBE41kIdb3P05ErGsmyJgmybSF%2BVYDNIpFSY28DPG8XbBh2QL4cGIAfHgXyCB0w4MEixAouOZxYiwuKCoSnzEmSFJUmctL0uuXl4Cy26cnuPJ8gKx7kKeKZnOKkrSowN6cBGCoPsq8Bqq%2B766vqhqTCa/6ASp5zSAAsgAkiBADKsHwfIHTrAc6H4Jhvq4QGILBtMXDEUlPDqYspAyfG8k7Ps9Hplwmy0GoNQ1FCmaZvYmZcZmInVmp4m3JJjzac27zte2gK6WCJlmR07GWdZtkYg5TnhXO7lLhuK4%2BUefkBeyQVnPuoVHgSwpRXMF5xbKt49YqqWqi%2BmralIn7yDqFQsKgOogaVQw5caf77AVwFSGVlXsdVCF1Q1npNT62F%2Bm1bZYTmBzdXwvB9eRlHUT2tHSGNIBFusng1J4tC0J49j1FwmgFvQhVidcm3RrGsnDSNKbKbjzP/lwFqietW3kRyNlvr0BxAA%3D%3D%3D)。但与大多数其他 RISC ISA 不同,RISC-Vauipc将 U 型立即数添加到程序计数器 https://en.wikipedia.org/wiki/RISC-V#Memory_access,无需从 GOT(全局偏移表)加载地址即可实现高效 PIC。 (最近的 MIPS 修订版还添加了一条 add-to-PC 指令,但很长一段时间 MIPS 在 PIC 方面表现相当糟糕)。
lui
可以对任何 4k 对齐地址进行编码,即具有 4k 页的页起始地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)