RISC-V ISA中的任何假设阻止堆栈增长而不是下降?



我想知道 ISA 中的任何内容是否会使堆栈增长(推送增加 sp,弹出降低 sp(性能降低或不可取?我知道这不是当今工具的工作方式,包括 Linux 和 GCC 端口,但除了"这将是疯狂的工作量"之外,还有什么根本原因吗?

我可以想到两个原因,为什么除了软件需要大量工作之外,它还会有问题。

第一个是关于RISC V的:压缩指令被设计成以正偏移量存储到堆栈中,偏移范围为sp+0sp+252(4的倍数(,而不是期望一个下降的堆栈:访问sp + N,其中N>=0,这是分配的堆栈内存,要么是一个简单的项目一个接一个地推送到堆栈上, 或函数的整个堆栈帧。 对于升序堆栈,sp+N,其中N>=4是自由堆栈内存,我们通常不希望访问它,因此您将丢失基于内存的局部变量和参数的压缩指令加载和存储。

第二个是实际问题,而不是RISC V问题:使用升序堆栈时,堆栈指针是指位于堆栈顶部的项目的末尾。 我们通常通过内存对象的第一个和最低地址来指代它们。   当不同大小的物品被放置在升序堆栈上时,堆栈顶部的项目地址(就与sp的偏移量而言(会根据项目的大小而变化——降序堆栈不会发生这种情况。

除了上述内容,例如性能,我认为硬件不会在乎。

这可能就像在微代码中翻转一点来添加而不是从 sp 中减去一样简单。

我能想到的根本原因是

  • 惯性。当需要更改每个工具链时,您为什么要这样做?
  • 安装基础。许多代码可能会假设堆栈的增长方向。你需要一个很好的理由来破坏现有的代码。
  • 复杂性。随着堆中的分配向更高的地址增长,您是否还想扭转这种情况以保持堆和堆栈相互增长?

最新更新