【问题标题】:JAL: what is the "alternate link register" x5 for?JAL:“备用链接寄存器”x5 是做什么用的?
【发布时间】:2017-11-17 06:56:53
【问题描述】:

RISC-V 规范 v2.2(JAL 指令,第 15 页)提到了“标准调用约定”:

标准软件调用约定使用 x1 作为返回地址寄存器,使用 x5 作为备用链接寄存器。

带有以下设计评论:

备用链接寄存器支持调用毫代码例程(例如,用于保存和恢复的例程) 压缩代码中的寄存器),同时保留常规返回地址寄存器。

什么是备用链接寄存器?

我知道“链接寄存器”是一个寄存器,用于存储返回时要跳转到的 pc,并且毫码/微码是低于 ISA 级别的较低级别的指令格式。是否使用x5 而不是x1 用于围绕“正常调用”的某些(微码/毫秒)指令以避免寄存器洗牌或溢出?你有一个典型的使用例子吗?

link registers 上的 Wikipedia 文章中添加对备用链接寄存器的解释可能会有所帮助,这是我寻找额外信息的地方。

【问题讨论】:

  • 如果近期没人能回答这个问题,你也可以在 sw-dev 邮件列表中提问。
  • @gasche 我想知道您是否对答案有任何更新?如果有,可以分享一下吗?

标签: riscv


【解决方案1】:

一般而言,millicode 指令不应与普通指令相交,并且需要另一种调用约定来调用millicode 过程 (from Waterman's PhD Thesis, page 66):

...例程必须 有一个备用调用约定,因为链接寄存器必须在他们的 执行。幸运的是,与 ARM 和 MIPS 不同,RISC-V 的跳转和链接指令可以 将返回地址写入任何整数寄存器,而不是破坏 ABI 指定的 链接寄存器。除了这种区别,这些毫代码例程的行为就像普通的 程序

一个更具体的原因,为什么应该保留链接寄存器,因为millicode用于实现序言和结尾,因此使用常规调用约定会破坏链接寄存器,并且会破坏使用millicode作为序言的整个想法/结语。

对于围绕“正常调用”的某些(微码/毫秒)指令,是否使用 x5 而不是 x1 来避免寄存器混洗或溢出?

是的……在某种程度上是“环绕”这个词。

你有一个典型的使用例子吗?

参见Waterman's PhD, page 67 中的prologue_2epilogue_2 毫码例程

00: c919     c.beqz a0, 16
02: 016002ef jal t0, prologue_2
06: 842a     c.mv s0, a0
08: 157d     c.addi a0, -1
0a: ff7ff0ef jal ra, factorial
0e: 02850533 mul a0, a0, s0
12: 0100006f jal x0, epilogue_2
16: 4505     c.li a0, 1
18: 8082     c.jr ra

prologue_2:

00: 1141 c.addi sp, -16
02: e406 c.sdsp ra, 8(sp)
04: e022 c.sdsp s0, 0(sp)
06: 8282 c.jr t0

epilogue_2

00: 60a2 c.ldsp ra, 8(sp)
02: 6402 c.ldsp s0, 0(sp)
04: 0141 c.addi sp, 16
06: 8082 c.jr ra

【讨论】:

  • 也许值得注意的是 RISC-V 毫码实现“采用普通 RISC-V 指令的形式”(脚注 11,第 66 页)——即它不是“低级指令格式”低于 ISA 级别”,正如 OP 所怀疑的那样。
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 2011-08-15
相关资源
最近更新 更多