为什么 RISCV 为协程选择“推入和弹出”RAS?

问题描述 投票:0回答:1

在 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 来进行协程?

cpu-architecture coroutine riscv
1个回答
0
投票

我也有同样的疑问。我使用了glibc中协程相关的库函数,但是编译器似乎没有生成利用RAS功能的指令。 在此输入图片描述

© www.soinside.com 2019 - 2024. All rights reserved.