3. 寄存器模型
3.1 寄存器文件
| 文件 | 数量/宽度 | 用途 |
|---|---|---|
v0–v127 | 每 lane,32 bit | 向量、地址与临时值 |
u0–u63 | 每 warp,32 bit | uniform 标量运算、地址、描述符、控制、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 | 编号 | 读写 | 说明 |
|---|---|---|---|
exec | 0x000 | rw | 当前 32 lane 执行掩码 |
mode | 0x001 | rw | 舍入 / 冲零 / 异常使能(§4.1) |
fflags | 0x002 | rw | 累积浮点标志 NX/UF/OF/DZ/NV;写入只保留 [4:0] |
trapctl | 0x003 | rw | 陷阱使能与暂停策略(内容留待后续版本) |
warpid | 0x010 | r | 物理 warp slot |
spid | 0x011 | r | SP(shader processor)编号 |
coreid | 0x012 | r | core 编号 |
wgslot | 0x013 | r | workgroup slot |
clock | 0x020 | r | 时钟低 32 位(功能口径:本 warp 已退休指令数) |
clockh | 0x021 | r | 时钟高 32 位 |
time | 0x022 | r | 时间低 32 位(功能口径:本 core 已提交指令数) |
timeh | 0x023 | r | 时间高 32 位 |
scratch_lo | 0x030 | r | scratch 基址低 32 位 |
scratch_hi | 0x031 | r | scratch 基址高 32 位 |
scratch_size | 0x032 | r | 每 lane scratch 字节数 |
code_lo | 0x033 | r | CODE_BASE 低 32 位 |
code_hi | 0x034 | r | CODE_BASE 高 32 位 |
trapbase | 0x040 | rw | 陷阱向量基址(可选处理程序) |
trapcause | 0x041 | rw | 陷阱原因(§5.2) |
trappc | 0x042 | rw | 陷阱 PC(相对 CODE_BASE) |
trapinfo | 0x043 | rw | 陷阱附加信息 |
- 读只读 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 保持不变。