在 riscv-spec-2.2 中,它为返回地址堆栈(RAS)行为提供以下真值表:
rd rs1 rs1=rd RAS action !link !link - none !link link - pop link !link - push link link 0 push and pop link link 1 push
我对“push and pop”的情况感到困惑,其中 riscv-spec-2.2 说它用于支持协程:
当两个不同的链接寄存器(x1 和 x5)被指定为 rs1 和 rd 时,RAS 会被压入和弹出以支持协程”
我还发现 riscv 邮件列表中有关于 RAS 真值表的讨论,但它没有解释为什么 RAS 的“push and pop”可以帮助协程(但它提到 Alpha 也有这种提示)协程):
https://groups.google.com/a/groups.riscv.org/d/msg/isa-dev/uZUTszCtgAA/f3jDhbjEAAAJ
以我的理解,RAS的“push和pop”将取代RAS的顶部条目。因此,当软件从协程返回时,由于正确的返回地址(在开头的 RAS 顶部条目)被替换,因此会出现错误预测。与简单的“push”相比,执行“push and pop”似乎没有任何好处。
为什么 RISCV 选择“push and pop”RAS 来进行协程?
我也有同样的疑问。我使用了glibc中协程相关的库函数,但是编译器似乎没有生成利用RAS功能的指令。 在此输入图片描述