LGPR¶
LGPR(Local General Purpose Register) 作为全局寄存器在块内的备份,并且仅在分离块中有效。
1.形参寄存器定义¶
在分离块设计中,每个块定义了 16个形参寄存器,用于与块头传入的 输入/输出全局寄存器(GPR) 进行绑定。具体划分如下:
| 类型 | 数量 | 寄存器名称 | 说明 |
|---|---|---|---|
| 输入寄存器 | 12 个 | RI0 ~ RI11 | 接收块头的全局寄存器输入 |
| 输出寄存器 | 4 个 | RO0 ~ RO3 | 将计算结果写回指定的全局寄存器 |
每个形参寄存器在块内作为局部变量使用,其值由块头在运行时动态绑定。
2.寄存器映射规则¶
形参寄存器通过 B.IOR 指令指定的输入输出寄存器列表进行映射。
映射顺序:形参寄存器 RI0 ~ RI11 对应块头传入的 前12个输入GGPR。RO0 ~ RO3 对应块头传入的 4个输出GGPR。
- 输入映射:
- RI0 -> 第1个输入GGPR
- RI1 -> 第2个输入GGPR
- ...
- RI11 -> 第12个输入GGPR(注:共12个输入,索引0~11)
- 输出映射:
- RO0 -> 第1个输出GPR
- RO1 -> 第2个输出GPR
- ...
- RO3 -> 第3个输出GPR(注:共4个输出,索引0~3)
映射是运行时动态绑定的,不同调用者可指定不同的GPR作为输入输出。
如果块头传入的输入输出寄存器数量少于形参寄存器的数量,那么编号相对较大的形参寄存器则处于未初始化状态。块内读取未初始化的形参寄存器,其结果是未定义的(undefined)。
3.示例解析¶
示例代码:
Header0:
MPAR .L1_body <LB0:64, LB1:32> [a1, a2, s0], ->T<256B>
Header1:
MPAR .L1_body <LB0:32, LB1:32> [a3, a4, a5], ->T<128B>
...
.L1_body:
l.madd lc0.uh, ri0.uh, lc1.uh, ->vu.w // ri0映射到块指令第1个输入GPR
l.lw [ri1.sd, vu#1.sw<<2], ->vt.w // ri1映射到块指令第2个输入GPR
l.madd lc1.uh, ri2.uh, lc0.uh, ->vu.w // ri2映射到块指令第3个输入GPR
l.sw vt#1.sw, [TO, vu#1.sw<<2]
bstop
| Header0 调用时 | Header1 调用时 |
|---|---|
| RI0 -> a1 | RI0 -> a3 |
| RI1 -> a2 | RI1 -> a4 |
| RI2 -> s0 | RI2 -> a5 |
| 其余 RI3~RI11 保持未定义(可忽略或置零) | RI3~RI11 未初始化 |
同一个 .L1_body 块体被多次调用,但每次传入不同的GPR,实现参数化执行。
4.总结¶
分离块通过 形参寄存器(RI/RO) 与 块头传入的GPR 动态绑定,具有如下优势:
| 优势 | 说明 |
|---|---|
| 代码复用 | 多个块头可共享同一个块体,减少重复代码 |
| 灵活性高 | 运行时动态绑定输入输出寄存器,适应不同调用场景 |
| 性能优化 | 避免复制数据,直接通过寄存器传递参数 |
| 支持向量化与并行 | 形参设计便于向量指令操作(如 v.madd, v.lw) |
这是灵犀指令集实现高效、灵活、可扩展计算模型的核心机制之一。