RISC-V 可变长度指令如何详细工作?

Bil*_*lly 1 instruction-set riscv

浏览 risc-v isa doc 后,它给我的印象是 riscv 支持 16 位(RVC)、32 位(RV32I)、64 位(RV64I)长度的指令。

对于 RV32I:立即数有符号扩展为 32 位

  • 指令长度:32位
  • 寄存器大小:32位
  • 内存地址:32位

对于 RV64i:立即数有符号扩展为 64 位

  • 指令长度:32位
  • 寄存器大小:64位
  • 内存地址:64位

RV32I 和 RV64I 似乎都使用 32 位指令大小,差异与符号扩展的大小有关。

我认为大指令大小允许您在指令中编码大量立即数,这应该比小指令大小更好,因为它很容易用完空间。

对于risc-v,RV64I,如果只使用32位指令长度,64位寄存器文件和内存地址,如何充分利用硬件资源。(例如,直接跳转到大内存地址。)

一般情况下,RV64I 的命名是否应该表示指令长度为 64 位?

Eri*_*idt 8

RISC-V 允许混合 16 位、32 位、48 位、64 位指令等!

RV32I 定义了 32 位计算机体系结构,其中寄存器为 32 位宽。它的指令都是 32 位宽的。例如,它必须lw将一个 32 位字加载到一个寄存器中,然后add添加两个寄存器并以第三个为目标。

RV64I 定义了 64 位计算机体系结构,其中寄存器为 64 位宽(因此是 RV64)——它的指令也是 32 位宽。RV32 指令仍然有效,并且还有一些额外的指令来适应 32 位和 64 位操作。例如,lw仍然加载 32 位字(尽管现在符号扩展以填充 64 位寄存器),因此使用新指令ld加载 64 位字。  add仍然添加了两个寄存器并以第三个为目标,但是add现在同样在执行 64 位加法而不是 32 位加法,因为寄存器是 RV64 中的 64 位。一条新指令addw执行 32 位加法,以防万一这就是您想要的。

RVC 是可以添加到 RV32I 或 RV64I 的扩展。当存在时,它允许 16 位指令,并且它的设计使得 16 位指令以 1:1 扩展为 32 位宽指令——因此,寄存器架构(RV32或添加了 RVC 的 RV64),从某种意义上说,在 32 位宽指令集中,他们可以做的没有什么新东西。我们应该更多地将其视为一种节省空间的技术,而不是一些新功能。

基本架构(即没有 RVC)允许分支到 16 位边界。PC 和返回地址以及所有分支指令都支持任何偶数字节值,因此当 RVC 被添加到某物时,其他指令不会改变。该工件还支持 48 位和 64 位指令,但尚未为这些大小定义扩展。

但是,指令集保留了足够的操作码空间,可以区分 16 位、32 位、48 位和 64 位指令。以二进制 11(在指令的最低位位置)开头的指令是 32 位大小的指令(但保留了一种模式:因此它们不能以 11111 开头)。紧凑指令在相同位置使用 00、01 和 10。48 位指令使用起始序列 011111,64 位指令以 0111111 开始。

基础架构还对所有内容使用 pc 相关分支,因此您可以构建一个代码段高达 4GB 的可执行映像(并且在加载时,它可以位于 64 位地址空间中的任何位置)。

RV32I 和 RV64I 似乎都使用 32 位指令大小,差异与符号扩展的大小有关。

RV32 与 RV64 相比,寄存器从 32 位扩展到 64 位,因此,是的,当 RV64 上发生符号扩展时,它会扩展到 64 位。

我认为大指令大小允许您在指令中编码大量立即数,这应该比小指令大小更好,因为它很容易用完空间。

RISC V 指令集是经过 MIPS(早期的 RISC 设计)多年研究后设计的。与具有可变长度指令大小的 x86 相比,MIPS 没有为 40 多年的演变留下足够的操作码空间。固定大小的指令集是代码空间和功能之间的权衡——指令大小越大,可以编码的越多,但代价是代码密度。代码密度对性能有巨大影响,因此不容忽视。因此,RISC V 允许可变大小的指令,如果您愿意,您可以在您的实现中创建 256 位指令!

对于risc-v,RV64I,如果只使用32位指令长度,64位寄存器文件和内存地址,如何充分利用硬件资源。(例如,直接跳转到大内存地址。)

可执行程序映像的代码大小可以高达 4GB,并且仍然使用 pc 相对分支——它将使用我们所说的远分支,其中分支序列由两条指令 (auipcjal) 组成。需要明确的是,4GB 是一个非常大的代码段。64 位架构的大部分价值在于能够处理超过 4GB 的数据,而不是超过 4GB 的代码。要达到超过 4GB 的代码大小,您将使用指针(例如存储在表中),因为指针可以是完整的 64 位宽。这种技术已经用于 DLL(即使将它们的大小加在一起时它们通常不会接近超过 4GB 的代码),因为它们通常是独立加载的(因此虽然与 pc 相关的分支将在单个代码部分,在代码部分之间进入是行不通的)。

一般情况下,RV64I 的命名是否应该表示指令长度为 64 位?

因为,无论我们拥有什么架构(例如 16 位、32 位、64 位),我们往往会在用完代码空间之前用完数据空间,所以 64 位架构的主要特征是它的支持 64 位地址空间,允许大量内存用于数据。这种对大地址总线的支持还伴随着使用 64 位地址的能力,当然也可以操作 64 位值。因此,RV64 的重要之处在于 64 位寄存器以及使用 64 位值寻址内存的能力。(指令大小是一个正交问题。)