作者 主题:带有两个RA的RISC:为什么? (Read 568 times)

0位成员和1位访客正在查看此主题。

 离线 滴滴

  • 经常贡献者
  • **
  • 帖子:275
  • 国家:  b
有两个RA的RISC:为什么?
« on: 2020年12月20日,下午02:26:50»
我昨天花了一天的时间与 在软件模拟器上用C编写的超标量处理器。一周前,一个花花公子给我寄了一个档案,但他不是作者(也许是在IBM工作的人吗?),他/她自己是未知的,而且没人知道任何内部细节,这使这个故事成为一个故事。神秘!无论如何,ISA有点类似于具有四个条件代码寄存器的PowerPC。 和两个返回地址寄存器,与主要的32条目寄存器文件分开  :wtf:

  • 通用PowerPC ISA允许使用计数寄存器作为普通链接寄存器的替代返回
  • RISCV ABI也保留两个寄存器供链接使用。
  • 其他? ...

因此,有一些具有两个类似RA的RISC设计示例,并且当然,两个RA不会同时使用,而是'有时似乎很方便,因为对于基于寄存器的例行返回,深度为2,而无需堆叠地址。但是那-两个专用的RA,即"ra0" and "ra1"-真的对我来说太奇怪了!

在评论中,我可以读到"第一级例程使用ra0返回,然后下一级例程使用ra1返回",因此拥有两个寄存器可以在函数中指定备用返回路径。

但是,为什么一个寄存器不够用呢?我不知道。不能仅将一个寄存器重新加载值吗?

嗯,在RISC-V上阅读,似乎第二个链接寄存器用于启用内部层" 毫码 ", namely "something"用于函数序言和函数尾声的情况。

困惑   :-//
 

 线上 硅向导

  • 超级贡献者
  • ***
  • 帖子:5912
  • 国家:  fr
回复:RISC有两个RA:为什么?
« 在以下方面回复#1: 2020年12月20日,下午06:08:04»
不确定我是否完全明白你的意思。我可以'我不会说所有现有的RISC ISA,但是对于RISC-V,我可以'我开始很了解。

像MIPS(我认为)一样,RISC-V也有一条跳转到给定地址的指令,同时将下一个PC(跳转指令之后的地址)存储在寄存器中。所以这就是"calls"通常处理。

RISC-V * ABI *储备"ra"作为它的主要寄存器(x1),并定义了一个备用寄存器(t0 / x5?)。但这只是使ABI保持一致的惯例。如果您不这样做,实际上您可以使用绝对其他任何寄存器'不必担心遵循ABI。

显然,并且以某种方式与其他线程相关,对于返回地址使用多于1的寄存器可以避免在某些特定情况下必须将其保存到堆栈中。其余部分与其他主题中的讨论非常相似。
 
以下用户感谢这篇文章: 滴滴

 离线 滴滴

  • 经常贡献者
  • **
  • 帖子:275
  • 国家:  b
回复:RISC有两个RA:为什么?
« 在以下方面回复#2: 2020年12月20日,晚上08:07:15»
引用
ISA有点类似于PowerPC,它具有四个条件代码寄存器和两个返回地址寄存器,与主32条目寄存器文件分开 

这是独特,出乎意料的部分,这让我感到困惑。
 

 离线 滴滴

  • 经常贡献者
  • **
  • 帖子:275
  • 国家:  b
回复:RISC有两个RA:为什么?
« 在以下方面回复#3: 2020年12月20日,晚上08:21:05»
第一个疑问和一个快速的问题:一对返回地址寄存器如何使用?

对于返回地址使用多于1个的寄存器可以避免在某些特定情况下必须将其保存到堆栈中

与RISC-V有关,但是'一个很好的确认。为什么有人和IBM需要花费宝贵的硅来实现与寄存器文件分开的两个RA(这不仅需要花费两个额外的锁存器,而且还需要额外的指令来管理它),而不是像RISC-V中那样更简单的解决方案?

那'仍然是一个悬而未决的问题。也许没有答案,但是我可以'目前,我没有看到任何重大优势,除了,也许我猜测超特定ISR代码(RT-OS之类的东西)中的假设超特定代码需要嵌套两次调用,并且总是和调用一样快。叶调用。
 

 离线 滴滴

  • 经常贡献者
  • **
  • 帖子:275
  • 国家:  b
回复:RISC有两个RA:为什么?
« 在以下方面回复#4: 2020年12月20日,晚上08:27:11»
码: [选择]
critical_code
   call func0
        call func1
             j (ra1)         The second level routine returns using ra1
        j (ra0)              The first level routine returns using ra0
 

 线上 硅向导

  • 超级贡献者
  • ***
  • 帖子:5912
  • 国家:  fr
回复:RISC有两个RA:为什么?
« 在以下问题上回复#5: 2020年12月20日,下午09:32:24»
为什么有人和IBM需要花费宝贵的硅来实现与寄存器文件分开的两个RA(这不仅需要花费两个额外的锁存器,而且还需要额外的指令来管理它),而不是像RISC-V中那样更简单的解决方案?

好,我没有'不能从您在OP中的措辞方式(或可能只是我的理解方式)得到确切的问题。至少对我来说,这更清楚了!

我不'也不是真的知道。我只能说-可能也与我们在另一个线程中讨论的安全性问题有关-是使用专用寄存器作为返回地址,就像使用专用返回堆栈一样(这里只有一个很小的堆栈) ,更安全。现在也许你可以考虑一下'只能稍微提高安全性,但是至少可以肯定地阻止了除专用于调用和返回的指令以外的任何其他指令访问这些寄存器。在现实生活中的代码中,您是否发现这是真正的好处,还是可以证明这一点,是另一回事。

只是我的2美分。设计师'理论依据可能有所不同。

哦,关于"precious silicon",仅在极小或超低功耗的芯片上(或在非常老的工艺中,"large"功能和相对较高的成本)真的很重要。任何中等复杂的CPU上有两个额外的寄存器吗?那's a no-brainer IMHO.

正如我在另一个线程中提到的那样,8位PIC MCU非常小,成本低廉,现在已经很老了,它们甚至专用于整个* 8 *入口返回堆栈。不只是2。这不是什么大问题,而且与功能强大的超标量处理器相比,这些处理器无疑非常简单。
« 上次编辑:2020年12月20日,9:36:58 pm by SiliconWizard »
 

 离线 滴滴

  • 经常贡献者
  • **
  • 帖子:275
  • 国家:  b
回复:RISC有两个RA:为什么?
« 在以下方面回复#6: 2020年12月20日,下午09:52:04»
哦,关于"precious silicon",仅在极小的情况下

Dunno,但是我从IBM Red and Green书籍中学到的是  在像PowerPC这样的超标量设计中,如果添加一个寄存器,它可能会与活动管道的数量重复,并且肯定会为管理添加更多的电路,所以我有这样的感觉'除非免费,否则您不能免费将其放在篮子里'对于某些东西真的很有用。
 

 离线 大卫·赫斯

  • 超级贡献者
  • ***
  • 帖子:12334
  • 国家:  我们
  • 戴维
回复:RISC有两个RA:为什么?
« 在以下方面回复#7: 2020年12月20日,晚上10:10:16»
对于具有独立返回地址寄存器的微体系结构,不依赖于服务于ALU的寄存器文件的端口,是否会有一些优势? 如果跳转是由不同的执行单元处理的,则可能是这种情况。

去年,我正在考虑类似的保存条件代码的寄存器文件。
 
以下用户感谢这篇文章: 滴滴

 线上 硅向导

  • 超级贡献者
  • ***
  • 帖子:5912
  • 国家:  fr
回复:RISC有两个RA:为什么?
« 在以下方面回复#8: 2020年12月20日,晚上10:46:03»
哦,关于"precious silicon",仅在极小的情况下

Dunno,但是我从IBM Red and Green书籍中学到的是  在像PowerPC这样的超标量设计中,如果添加一个寄存器,它可能会与活动管道的数量重复,并且肯定会为管理添加更多的电路,所以我有这样的感觉'除非免费,否则您不能免费将其放在篮子里'对于某些东西真的很有用。

始终提防教条式的规则。答案几乎总是取决于所讨论的实际设计。如果在特定的体系结构中花费很多,那么它将花费很多。明显。如果不...

在这里,专用的返回地址寄存器只能通过有限的指令以有限的方式访问,因此处理通用逻辑寄存器所需的逻辑量可能不会相同。
 

 离线 布鲁斯胡特

  • 超级贡献者
  • ***
  • 职位:1955
  • 国家:  nz
  • 前身为SiFive,Samsung R&D
回复:RISC有两个RA:为什么?
« 在以下问题上回复#9: 2020年12月20日,晚上11:04:50»
两种情况有所不同。

在PowerPC上,PC,LR和CTR在它们自己的一个小的执行单元中处于关闭状态,这有可能在计数循环中比其他机器提前运行。  I *think* (but it'一段时间以来)可以使用CTR跳转到该地址的功能来通过指针调用函数以及使用密集切换语句中的跳转表。它'从通用寄存器到CTR的快捷简便的操作(因为无论如何计数循环都需要这样做)。我不'回想一下从GPR转向LR是否有障碍。

在RISC-V的基本指令集(32位操作码)中,就硬件而言,您可以使用* any *寄存器来保存返回地址。 C扩展名仅将ra(x1)作为返回地址,但仅影响(或不减少)代码大小,而不影响功能。

如果限制了函数调用的深度并且没有执行任何操作,则在极小的嵌入式应用中,您可能会使用根本没有RAM的RISC-V CPU。't use recursion. You'd必须手动(或在特殊的链接器中)对在不同深度调用的函数所使用的寄存器进行分区,包括在其接收返回地址的位置。

在更普通的系统中,某些特殊的编译器或运行时库函数将x5(aka t0)用作返回地址,这些函数可能在函数有机会保存ra或恢复ra之后被调用。这可能包括某些类型的重击,填充,动态链接等,所有这些都可以随意破坏任何或所有t0-t6寄存器,因为不允许调用函数和被调用函数关心其值的保留。

x5作为返回寄存器的一种常见用法是,如果为gcc / clang提供-msave-restore选项。在这种情况下,每个函数的第一条指令是对编译器库例程的调用,该例程生成堆栈帧并在返回之前保存ra和一定数量的s0-s11。然后,该函数的最后一条指令跳转到编译器库例程,该例程重新加载ra和相同数量的s0-s11,删除堆栈帧,并返回到刚刚恢复的ra。这是ARM的替代品's的push和pop指令增加了每个函数的时间开销(三个跳转),并为库例程添加了96个字节的代码,以换取更简单的CPU实现。

作为一种优化,某些RISC-V CPU具有较小的(可能是2到8级)集成的返回地址预测堆栈,该堆栈允许在函数返回之后甚至从ra重新加载ra之前就预取指令。参考返回地址预测堆栈。当JAL和JALR指令以特定模式(在ISA手册中列出)使用ra或t0时,按下或弹出。
« 最后编辑:2020年12月20日,晚上11:06:25 by brucehoult »
 
以下用户感谢这篇文章: 滴滴

 离线 滴滴

  • 经常贡献者
  • **
  • 帖子:275
  • 国家:  b
回复:RISC有两个RA:为什么?
« 在以下问题上回复#10: 2020年12月22日,上午10:37:01»
谢谢@brucehoult  :D

昨天我进行了深入的研究,而神秘的软件处理器实际上只是一个减少指令集的真正的PowerPC!它'专注于Clang / LLVM编译器可能使用的指令,并且该项目周围有几条说明"eventually" the author'd要添加所有说明  but he didn't due to "代码稳定性和错误" which are 这类项目总是有问题...

反正'非常有趣的是,即使是ISA的子集,也有一些指令可以利用两个RA。
 


分享我

 掘客    脸书    SlashDot    美味的    Technorati    推特    谷歌    雅虎
中频