为什么RV64为32位操作而不是64位操作引入了新的操作码

san*_*naj 5 assembly instruction-set opcode 32bit-64bit riscv

在通过RISC-V规范时,我注意到64位版本与32位版本的不同之处在于,

  1. 将寄存器扩展到64位
  2. 更改了指令以对整个64位范围执行操作。
  3. 添加了新指令以执行32位操作

这使得RV32代码不兼容RV64。但是,如果64位版本已经实施方式:

  1. 将寄存器扩展到64位
  2. 重命名ADD/SUB/SHL/..ADDW/SUBW/SHLW/..与标志让他们只能在32位操作系统上延伸。
  3. 添加新的指令ADD/SUB/SHL/..ADDD/SUBD/SHLD/..在全部64位行为

这样,RV32程序也可以在RV64上运行。为了实现CPU,工作量将保持不变,因为在两种情况下都必须实现64位和32位指令,而只有64位和32位版本的操作码将被交换。符合规范。(除了乘法指令。)

那么,为什么RISC-V为什么决定将新的操作码分配给RV64中的32位操作而不是64位操作?

Mic*_*has 6

RV64 和 RV32 非常兼容。如果程序不依赖于隐式模 32 位算术并且所有地址都适合 32 位,则机器代码可能是相同的。然而,向 RV64 处理器添加完整的 RV32 用户模式非常容易。

\n\n

RV32 的 64 位超集太复杂了。AUIPC、JAL、LOAD、STORE 和 BRANCH 没有足够的操作码空间。如果有额外的扩展,情况会更糟。

\n\n

RV64 中的少数 32 位指令主要用于过度使用模 32 位算术的程序。这是很常见的问题。不过,快速且可移植的代码应该避免它们。

\n