Skip to main content

3. 寄存器模型

3.1 寄存器文件​

文件数量/宽度用途
v0–v127每 lane,32 bit向量、地址与临时值
u0–u63每 warp,32 bituniform 标量运算、地址、描述符、控制、lane 掩码
  • 半寄存器 vreg16:32 位 v 寄存器的 .l(低 16 位)/ .h(高 16 位)一半;编码 raw[7:1] = 寄存器号、raw[0] = 半选择。半精度操作不改变另一半;两半互为别名。
  • 64 位寄存器对:vpair/upair 必须偶数对齐,低编号寄存器存低字;奇数对齐执行时报 IllegalInsn(v0.1.2)。regs:N 操作数命名 N 个连续寄存器(向量加载、描述符等)。
  • 描述符:udesc4 = u[4n..4n+3](buffer/sampler)、udesc8 = u[4n..4n+7](image),4 对齐;全零描述符为 null。
  • 64 位整数/浮点结果使用偶对齐寄存器对(pair64);movrel 的 index() 是寄存器号(V[rs1 + u2]),越出 dispatch 分配读 0/写丢弃、不陷阱(v0.1.2)。

3.2 EXEC 模型​

exec.get 读出 EXEC、exec.set 写入;saveexec.* 原子地把旧 EXEC 存入目的 uniform 并设置新 EXEC;exec.wqm 进入 whole-quad 模式:

saveexec.and u_old, u_cond : u_old = EXEC; EXEC = EXEC & u_cond
saveexec.or u_old, u_cond : u_old = EXEC; EXEC = EXEC | u_cond
saveexec.xor u_old, u_cond : u_old = EXEC; EXEC = EXEC ^ u_cond
saveexec.andn1 u_old, u_cond : u_old = EXEC; EXEC = u_cond & ~EXEC (else = saved & ~then)
saveexec.andn2 u_old, u_cond : u_old = EXEC; EXEC = EXEC & ~u_cond (loop continue mask)
saveexec.mov u_old, u_cond : u_old = EXEC; EXEC = u_cond

典型 if/else:saveexec.and 保存 then 掩码 → saveexec.andn1 得 else 掩码 → 尾部 exec.set 恢复。循环:saveexec.andn2 保存退出条件的补集,bexecnz 在 EXEC 非零时回跳,循环尾恢复外层掩码。源在写目的之前读取(v0.1.2):saveexec.*、jalr、mac 等允许 rd 与任一源相同。EXEC 为零的 warp 可提前跳过向量指令,但 uniform 控制流仍须保持结构化。

3.3 CSR​

CSR编号读写说明
exec0x000rw当前 32 lane 执行掩码
mode0x001rw舍入 / 冲零 / 异常使能(§4.1)
fflags0x002rw累积浮点标志 NX/UF/OF/DZ/NV;写入只保留 [4:0]
trapctl0x003rw陷阱使能与暂停策略(内容留待后续版本)
warpid0x010r物理 warp slot
spid0x011rSP(shader processor)编号
coreid0x012rcore 编号
wgslot0x013rworkgroup slot
clock0x020r时钟低 32 位(功能口径:本 warp 已退休指令数)
clockh0x021r时钟高 32 位
time0x022r时间低 32 位(功能口径:本 core 已提交指令数)
timeh0x023r时间高 32 位
scratch_lo0x030rscratch 基址低 32 位
scratch_hi0x031rscratch 基址高 32 位
scratch_size0x032r每 lane scratch 字节数
code_lo0x033rCODE_BASE 低 32 位
code_hi0x034rCODE_BASE 高 32 位
trapbase0x040rw陷阱向量基址(可选处理程序)
trapcause0x041rw陷阱原因(§5.2)
trappc0x042rw陷阱 PC(相对 CODE_BASE)
trapinfo0x043rw陷阱附加信息
  • 读只读 CSR、写未知 CSR 一律触发 cause 9(trapinfo = CSR 号);csrs/csrc 即使不改变值,目标只读同样非法(判定在目标,不在结果)。
  • warpid 是物理 warp slot(逻辑 warp/subgroup id 见 ABI 的 u29);clock/time 是功能性指令计数(本 warp 已退休 / 本 core 已提交),不是真实时间(v0.1.2)。
  • mode/fflags 位布局见 §4;trap* 见 §5。写 mode 的候选值(csrs/csrc 为组合后的值)含保留位或保留 rm 编码时触发 cause 8,MODE 保持不变。