跳转至

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)

这是灵犀指令集实现高效、灵活、可扩展计算模型的核心机制之一。