为什么不用x5~x11作为临时寄存器? 有什么理由吗?
不能说为什么设计师选择有点混乱的顺序。
但我可以说没关系,因为它对硬件或软件没有影响。这是因为没有指令通过一个寄存器编号引用多个顺序寄存器。
MIPS 和 RISC V 都没有的一个例子是存储多个寄存器指令,其中一个寄存器编号,例如一个较低的数字,被明确指定,然后对于某些寄存器计数,隐含了连续的寄存器编号。
在这样做的体系结构中,重要的是,例如,至少对调用保留(也称为被调用者保存)寄存器进行连续编号,以优化该指令的使用。在寄存器编号中仔细放置返回地址寄存器也有帮助。
在 RISC V 中,寄存器编号始终是显式的,唯一的例外是压缩指令扩展,其中寄存器编号是隐含的,即 sp,用于局部内存变量操作,但从来没有用于寄存器范围。
在这种情况下,任何其他替代寄存器使用顺序既没有优点也没有缺点。
简而言之,为简单起见。
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 | - |