gpt4 book ai didi

riscv - 为什么 JALR 对偏移量的 LSB 进行编码?

转载 作者:行者123 更新时间:2023-12-05 00:09:54 25 4
gpt4 key购买 nike

我们知道 jal 指定了一个 21 位的偏移量。但是,它不编码 21 位偏移量而是编码 20 位偏移量。原因是地址的最低有效位始终为零,因为最小的 RISC-V 指令是 2 个字节,因此该位未在指令中编码。

通过以这种方式对偏移进行编码,它可以提供 ±1MiB 的跳跃范围。如果 jal 确实对 LSB 进行了编码,它只会提供 ±512KiB 的跳跃范围。

但是,指定 12 位偏移量的 jalr 指令确实对 LSB 进行编码。这将跳跃范围减少到 ±2kiB(而不是 ±4kiB)。我知道 jalr 使用 I 类型格式,它与 addi 相同,并且必须为此类指令编码立即数的 LSB。但是,我认为没有理由必须为 jalr 编码最低有效位。

最佳答案

JALR 用于两个相对不同的目的:

  • 间接分支,例如
  • 函数返回
  • 间接函数调用(例如函数指针;vtables/虚拟调度),以及
  • 中远分支(在两条指令序列中,相对于 32 位 pc 范围)。

  • 对于前者,间接分支,立即数始终为 0,也就是说实际上根本不使用立即数!

    对于后者,该指令与 AUIPC 结合使用,形成 pc 相对寻址的高 20 位 - 然后结合使用 JALR 形成低 12 位,总 pc 相对偏移量为 32-位。

    但是, AUIPC 既用于远分支,也用于 pc 相关数据访问。因此,它们都共享 12 位偏移量——加载/存储使用它们的 12 位立即数,而 JALR 也使用 12 位立即数字段,就像加载和存储一样。设计人员选择共享 AUIPC 而不是为这两种用途使用两个不同的 AUIPC(从代码到代码的引用与从代码到数据的引用)。

    综上所述, JALR 的范围多半不重要,只要能提供剩余的 12 位来补充 AUIPC 的 20 位即可。当然还有其他方法,但这确实具有重用和只需要一个 AUIPC 指令的优点。

    关于riscv - 为什么 JALR 对偏移量的 LSB 进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59480845/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com