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

2024-01-27

我有一些与 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(使用前将#替换为@)

RISC V手册混淆:指令格式VS立即数格式 的相关文章

  • 如果我的部署目标是8.0,我们是否需要为“armv7”和“arm64”编译iOS应用程序?

    我的应用程序支持iOS8 0及以上版本 而且我知道从iOS7开始它的arm64位架构 在这种情况下 我们是否需要编译 armv7 和 arm64 切片的二进制文件 如果我单独编译arm64 我可以减少我的应用程序大小 这是正确的方法吗 请帮
  • func 在 R-Format 指令集中意味着什么?

    I am very new to Assembly language I was reading about MIPS architecture and I am stuck with the last field of the Regis
  • 汇编器:为什么存在BCD?

    我知道如果您不了解二进制 BCD 是更直观的数据类型 但我不知道为什么要使用这种编码 它好像没有多大意义 因为它浪费 以 4 位表示 当表示大于 9 时 另外我认为 x86 只支持直接添加和替换 您可以通过 FPU 转换它们 这有可能来自旧
  • GDB 中断命令不会在命令文件中执行

    我有一个调试脚本 它执行以下操作 设置两个断点 让我们称呼他们吧start and end断点 启动后 脚本将继续执行 直到start命中断点 once start命中断点 我执行单步执行 直到end命中断点 这是我的命令文件 end br
  • 了解微架构原因,使更长的代码执行速度提高 4 倍(AMD Zen 2 架构)

    我有以下 C 17 代码 是在 x64 模式下使用 VS 2019 版本 16 8 6 编译的 struct declspec align 16 Vec2f float v 2 struct declspec align 16 Vec4f
  • 包容还是排他? Intel Core IvyBridge 处理器中的 L1、L2 缓存

    我有 Intel Core IvyBridge 处理器 Intel R Core TM i7 3770 CPU 3 40GHz L1 32KB L2 256KB L3 8MB 我知道L3是包容性的 是多核共享的 我想了解有关我的系统的以下信
  • 在 Linux 上以编程方式获取准确的 CPU 缓存层次结构信息

    我试图获得 Linux 上当前 CPU 的数据缓存层次结构的准确描述 不仅是各个 L1 L2 L3 可能还有 L4 数据缓存的大小 还包括它们在不同系统之间分割或共享的方式核心 例如 在我的 CPU AMD Ryzen Threadripp
  • 虚拟化页表的工作原理

    阅读有关虚拟化页表概念的内容 其中部分页表放入虚拟内存中 维基百科 https en wikipedia org wiki Page table Virtualized page table以及 Patterson 和 Hennessy 页
  • Intel x86 与 AMD x86 CPU 上的访问性能不一致

    我已经实现了一个带有结构内存布局数组的简单线性探测哈希图 该结构包含键 值和指示条目是否有效的标志 默认情况下 该结构体由编译器填充 因为键和值是 64 位整数 但该条目仅占用 8 个布尔值 因此 我也尝试以未对齐访问为代价来打包结构 由于
  • 零/符号扩展是无操作的,为什么要为每种大小类型提供指令呢?

    对于 x86 和 x64 编译器生成类似的零 符号扩展 MOVSX 和 MOVZX 扩展本身并不是免费的 但允许处理器执行无序魔法加速 但在 RISC V 上 因此 无符号和有符号 32 位整数之间的转换是无操作 从有符号 32 位整数到有
  • 如何将数据直接写入显存?

    程序员有什么办法可以直接将数据写入显存吗 我知道操作系统对此非常严格 但是某些类型的应用程序 例如视频播放器或电脑游戏 如何将其数据直接写入视频内存 我知道有很多知名的库 例如 OpenGL 但它们毕竟只是普通的库 它们和我和你写的程序没有
  • gcc 优化标志 -O3 使代码比 -O2 慢

    我找到这个话题为什么处理排序数组比处理未排序数组更快 https stackoverflow com questions 11227809 why is processing a sorted array faster than an un
  • 为什么64位cpu不存在高端内存?

    当我试图了解 32 位 cpu 和 Linux 的高内存问题时 为什么没有高内存问题 https en wikipedia org wiki High memory对于64位CPU 特别是 虚拟内存分为内核空间和用户空间的划分是如何改变的
  • 可以直接使用程序集访问缓存吗?

    就效率而言 缓存是一个核心问题 我知道缓存通常会自动发生 但是 我想自己控制缓存的使用 因为我认为我可以比一些不知道确切程序的启发式方法做得更好 因此 我需要汇编指令来直接移入或移出高速缓存单元 like movL1 address con
  • GCC最高指令集,兼容多种架构

    我正在由具有不同架构的机器组成的集群上运行作业 gcc march native Q help target grep march cut f3给了我其中之一 broadwell haswell ivybridge sandybridge
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • 如何确定 Windows 10 上可执行二进制文件的体系结构

    给定一些Random exe在 Windows 上 我如何确定 它的CPU架构 例如Intel ARM 以及 它的位数 例如 32 或 64 我可以使用文件资源管理器 其他工具或编程方法中的属性吗 Cygwin https www cygw
  • 哪种架构称为非均匀内存访问(NUMA)?

    根据wiki http en wikipedia org wiki Non uniform memory access 非均匀内存访问 NUMA 是一种用于多处理的计算机内存设计 其中内存访问时间取决于相对于处理器的内存位置 但尚不清楚它是
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验

随机推荐