为什么RISC-V中临时寄存器和保存寄存器没有顺序编号?

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

为什么不用x5~x11作为临时寄存器? 有什么理由吗?

enter image description here

assembly cpu-registers riscv calling-convention abi
2个回答
1
投票

不能说为什么设计师选择有点混乱的顺序。

但我可以说没关系,因为它对硬件或软件没有影响。这是因为没有指令通过一个寄存器编号引用多个顺序寄存器。

MIPS 和 RISC V 都没有的一个例子是存储多个寄存器指令,其中一个寄存器编号,例如一个较低的数字,被明确指定,然后对于某些寄存器计数,隐含了连续的寄存器编号。

在这样做的体系结构中,重要的是,例如,至少对调用保留(也称为被调用者保存)寄存器进行连续编号,以优化该指令的使用。在寄存器编号中仔细放置返回地址寄存器也有帮助。

在 RISC V 中,寄存器编号始终是显式的,唯一的例外是压缩指令扩展,其中寄存器编号是隐含的,即 sp,用于局部内存变量操作,但从来没有用于寄存器范围。

在这种情况下,任何其他替代寄存器使用顺序既没有优点也没有缺点。


1
投票

简而言之,为简单起见。

RVC 指令格式 CL、CS、CB 和 CJ 仅为其寄存器编号字段提供三位。这简化了指令解码器的硬件设计,因为只需要三行,而不是五行。将任意常数“8”添加到这些三位数。这由指令说明(RISC-V greencard)中显示的素数标记表示。

在 RVC 的情况下,如 RISC-V 压缩指令集规范 的表 1.2 所示,不包括 16 位数范围内的三个临时寄存器,因此不应使用。它们作为格式类型 CL、CS、CB 和 CJ 的参数是不可访问的,而且会导致其他寄存器被破坏,如下所示。例如,在由寄存器 a3 的修改和分支控制的循环中使用寄存器 t0 将是一个极难发现的运行时错误!

reg#  reg#' (used in CL-, CS-, CB-, CJ-Types)
x[5]   - (5 + 8 = x[13] = a3 (!)
x[6]   - (6 + 8 = x[14] = a4 (!)
x[7]   - (7 + 8 = x[15] = a5 (!)
x[8]   0    + 8 = x[8] = s0
x[9]   1    + 8 = x[9] = s1
x[10]  2    + 8 = x[10] = a0
x[11]  3    + 8 = x[11] = a1
x[12]  4    + 8 = x[12] = a2
x[13]  5    + 8 = x[13] = a3
x[14]  6    + 8 = x[14] = a4
x[15]  7    + 8 = x[15] = a5
------
x[16]  - (0 + 8 = x[8] = s0 (!)
x[17]  - (1 + 8 = x[9] = s1 (!)
...
x[31]  - (7 + 8 = x[15] = a5 (!)

具有此三位限制的 RVC 扩展说明如下所示。

r(d,s1,s2) r = 8 + r'
添加 -
阿迪 -
addi16sp addi4spn
阿迪 addw
-
- 安迪
- beqz
- bnez
fldsp fld
flwsp flw
fsdsp fsd
fswsp fsw
贾尔 -
-
ldsp
li -
lui -
lwsp lw
MV -
-
sdsp sp
slli -
- srai
- srli
-
- subw
swsp sw
- 异或
电话 -
csrr、csrc、csrci、csrrc -
© www.soinside.com 2019 - 2024. All rights reserved.