JAL:什么是"备用链接寄存器" x5 for?

时间:2017-06-14 23:45:54

标签: riscv

RISC-V规范v2.2(JAL指令,第15页)说明"标准呼叫约定":

  

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

以下设计评论:

  

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

什么是替代链接注册?

我理解"链接寄存器"是一个寄存器,用于存储pc在返回时跳转到,并且该millicode / microcode是低于ISA级别的低级指令格式。对于围绕"正常呼叫"的某些(微代码/毫字节)指令,x5使用而不是x1 的想法是什么?避免注册改组或泄漏?你有一个典型的用法例子吗?

将备用链接寄存器的说明添加到link registers上的维基百科文章中可能会有所帮助,这是我寻找额外信息的地方。

1 个答案:

答案 0 :(得分:7)

一般来说,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