SGPR¶
说明¶
SGPR(General Purpose Scalar Register)是第二层架构状态中通用的标量寄存器,每个寄存器都是64bit宽。这组寄存器专门用于块体指令之间的数据传递,因此对于第一层的块头指令而言这些寄存器是不可见的。
相对索引¶
与传统的标量寄存器不同的是,块指令内部的标量寄存器定义在一至多种固定深度的循环队列中。这种方式可以有效提高寄存器资源的利用率,对于超出队列范围的寄存器硬件可以自行释放和再利用,避免寄存器资源浪费。
- 当指令向某种队列的寄存器中写入内容时,总是写到队列队尾处。因此指令只需要指定输出的队列类型即可,不需要具体指定写到哪个寄存器中。
- 当指令从某种队列的寄存器中读取内容时,需要通过相对距离参数来指示读取队列中哪个寄存器。例如:读取本队列中最近一次被写入的寄存器时,相对距离为1;读取更前一次被写入的寄存器时,相对距离为2;以此类推.....。
硬件实现每种寄存器队列的方式是使用一个寄存器的滑动窗口,或者带卷绕(Wrap-Around)的寄存器文件。随着指令向后执行,之前指令的结果以划窗方式保存。示意图如下:

如上图所示,处在划窗内的寄存器被保留,超出划窗范围的寄存器则可以被释放掉并且被再次使用。
寄存器类型¶
这种采用相对索引的方式进行编码的寄存器又称为相对索引寄存器。为了同时保证存储短生命周期变量的寄存器快速申请和释放以及长生命周期的变量可以长时间保留,指令集提供了两种寄存器队列,分别称为T队列和U队列,并且每个队列的深度都为 4。T队列的寄存器命名为 TR1-TR4,用于保存4条输出至T寄存器队列的指令结果。U队列的寄存器命名为 UR1-UR4,用于保存4条输出至U寄存器队列的指令结果。
两组相对索引寄存器定义如下:
| 寄存器名 | 寄存器别名 | 解释 |
|---|---|---|
| TR1 | t#1 | T结果队列前序第一条指令结果 |
| TR2 | t#2 | T结果队列前序第二条指令结果 |
| TR3 | t#3 | T结果队列前序第三条指令结果 |
| TR4 | t#4 | T结果队列前序第四条指令结果 |
| UR1 | u#1 | U结果队列前序第一条指令结果 |
| UR2 | u#2 | U结果队列前序第二条指令结果 |
| UR3 | u#3 | U结果队列前序第三条指令结果 |
| UR4 | u#4 | U结果队列前序第四条指令结果 |
- 对于输出至相对索引寄存器的指令而言,每条指令可以指定输出到哪一种寄存器队列,后序指令使用引用参数索引它们。
- 对于正在执行的块体指令来说,可以引用前序1至4条输出至T寄存器或U寄存器队列的指令结果。
引用参数通过输出至同一种队列的指令之间的相对距离计算得到。例如对于如下的程序序列:
ldi [a0, 0], ->t # i0,输出到T寄存器队列
ldi [a1, 0], ->t # i1,输出到T寄存器队列
ldi [a0, 8], ->u # i2,输出到U寄存器队列
add t#2, t#1, ->a2 # i3,输入分别引用i0和i1的结果。
b.eq u#1, 0, 2f # i4,输入引用i2的结果,无寄存器输出
slli u#1, 4, ->u # i5,输入引用i2的结果,输出到U寄存器队列
sd u#1, [a2, 8] # i6,输入引用i5的结果,无寄存器输出
- 指令的输入索引前序指令结果时,引用距离跳过未输出到该队列的指令。
- 指令输出时则不需要描述引用参数,寄存器队列会自动分配一个寄存器给对应的指令。
访问属性¶
这组寄存器都是可读可写的(RW)。