在浏览 RISC-V 规范时,我注意到 64 位版本与 32 位版本的不同之处在于,它
- 将寄存器扩展至 64 位
- 更改了指令以作用于整个 64 位范围。
- 添加了执行 32 位操作的新指令
这使得 RV32 代码与 RV64 不兼容。
但是,如果 64 位版本是通过以下方式实现的:
- 将寄存器扩展至 64 位
- 重命名
ADD/SUB/SHL/..
to ADDW/SUBW/SHLW/..
并使它们仅在带符号扩展的 32 位上运行。
- 添加新指令
ADD/SUB/SHL/..
or ADDD/SUBD/SHLD/..
作用于完整的 64 位
这将允许 RV32 程序也可以在 RV64 上运行。为了实现 CPU,工作量将保持不变,因为在这两种情况下都必须实现 64 位和 32 位指令,并且相比之下,仅交换 64 位和 32 位版本的操作码符合规格。 (乘法指令可能除外。)
那么为什么 RISC-V 决定将新的操作码分配给 32 位操作而不是 RV64 中的 64 位操作呢?
RV64 和 RV32 非常兼容。如果程序不依赖隐式模 32 位算术并且所有地址都适合 32 位,则机器代码可能是相同的。然而,向 RV64 处理器添加完整的 RV32 用户模式非常容易。
RV32 的 64 位超集太复杂了。 AUIPC、JAL、LOAD、STORE 和 BRANCH 没有足够的操作码空间。如果有额外的扩展,情况会更糟。
RV64 中的少数 32 位指令主要用于过度使用模 32 位算术的程序。这是很常见的问题。不过,快速且可移植的代码应该避免它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)