RISC-V规范v2.2(JAL指令,第15页)说明"标准呼叫约定":
标准软件调用约定使用x1作为返回地址寄存器,x5作为备用链接寄存器。
以下设计评论:
备用链接寄存器支持调用millicode例程(例如,保存和恢复的例程) 在保留常规返回地址寄存器的同时注册压缩代码。
什么是替代链接注册?
我理解"链接寄存器"是一个寄存器,用于存储pc在返回时跳转到,并且该millicode / microcode是低于ISA级别的低级指令格式。对于围绕"正常呼叫"的某些(微代码/毫字节)指令,x5
使用而不是x1
的想法是什么?避免注册改组或泄漏?你有一个典型的用法例子吗?
将备用链接寄存器的说明添加到link registers上的维基百科文章中可能会有所帮助,这是我寻找额外信息的地方。
答案 0 :(得分:7)
一般来说,millicode指令不应该与普通指令相交,并且需要一个替代的调用约定来调用millicode过程(from Waterman's PhD Thesis, page 66):
...例程必须 有一个备用调用约定,因为链接寄存器必须在它们期间保留 执行。幸运的是,与ARM和MIPS不同,RISC-V的跳转和链接指令可以 将返回地址写入任何整数寄存器,而不是破坏指定的ABI 链接寄存器。除了这种区别,这些毫微微程序就像普通的一样 程序
一个更具体的原因,为什么链接寄存器应该被保留,是因为millicode用于实现序言和结尾,因此使用常规调用约定将破坏链接寄存器并且将破坏使用millicode进行序言的整个想法/尾声。
是否使用x5而不是x1来处理围绕“正常调用”的某些(微代码/毫字节)指令,以避免寄存器混乱或溢出?
是......在某种程度上“环绕”一词。
查看您是否有典型的使用示例?
prologue_2
,epilogue_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