Skip to main content

2. 编码格式

2.1 长度编码​

低位长度编码优先于 opcode:

匹配宽度
(w0 & 0x1) == 0x032 位
(w0 & 0x3) == 0x164 位

w0[1:0] = 11 保留(v0.1 非法,留给更长的指令)。PC 按字节计数、始终 4 字节对齐;顺序执行时 PC +4 或 +8。

2.2 格式表(28 种)​

位图范围为 [msb:lsb];opcode、fN 等固定字段由 YAML 指令项决定;既不是固定字段也不是操作数的位必须为零(reserved-must-be-zero)。

格式宽度位图(高位在左)用途
R32f4[31:28] rs2[27:21] rs1[20:14] rd[13:7] opcode[6:0]向量三源
RU32f5[31:27] rs2[26:21] rs1[20:14] rd[13:7] opcode[6:0]向量 + uniform 源
I832imm[31:24] f3[23:21] rs1[20:14] rd[13:7] opcode[6:0]8 位立即数
R132f11[31:21] rs1[20:14] rd[13:7] opcode[6:0]向量一元
R1U32f12[31:20] rs1[19:14] rd[13:7] opcode[6:0]向量目的、uniform 源
LI32imm[31:14] rd[13:7] opcode[6:0]向量立即数
C32f5[31:27] rs2[26:20] rs1[19:13] rd[12:7] opcode[6:0]向量 → uniform(比较 / 归约)
CU32f6[31:26] rs2[25:20] rs1[19:13] rd[12:7] opcode[6:0]向量 + uniform → uniform
CI32imm[31:24] f4[23:20] rs1[19:13] rd[12:7] opcode[6:0]uniform 结果 + 立即数
UR32f7[31:25] rs2[24:19] rs1[18:13] rd[12:7] opcode[6:0]三 uniform 源
UI32imm[31:22] f3[21:19] rs1[18:13] rd[12:7] opcode[6:0]uniform + 10 位立即数
U132f13[31:19] rs1[18:13] rd[12:7] opcode[6:0]uniform 一元 / EXEC / 片段控制
ULI32imm[31:15] f2[14:13] rd[12:7] opcode[6:0]uniform 立即数 / PC 相对
J32imm[31:10] f3[9:7] opcode[6:0]无条件 PC 相对跳转
JL32imm[31:13] rd[12:7] opcode[6:0]跳转并链接
B32imm[31:15] f2[14:13] rs1[12:7] opcode[6:0]uniform 条件分支
JR32imm[31:22] f3[21:19] rs1[18:13] rd[12:7] opcode[6:0]间接跳转 / 返回
SYS32imm[31:12] f5[11:7] opcode[6:0]系统 / 屏障 / cache 控制
WAIT32sm[31:30] sfu[29:27] ls[26:23] vst[22:18] tex[17:13] vm[12:7] opcode[6:0]多计数器 waitcnt
CSR32csr[31:22] f3[21:19] rs1[18:13] rd[12:7] opcode[6:0]CSR 访问
X64z[63:55] sat[54:54] abs[53:51] neg[50:48] rm[47:45] f10[44:35] rs3[34:28] rs2[27:21] rs1[20:14] rd[13:7] opcode[6:0]三源 VALU + FP 修饰(neg/abs/sat/rm)
XL64imm[63:32] f11[31:21] rs1[20:14] rd[13:7] opcode[6:0]VALU + 32 位 literal
H64z[63:59] sat[58:58] abs[57:55] neg[54:52] rm[51:49] f10[48:39] rs3[38:31] rs2[30:23] rs1[22:15] rd[14:7] opcode[6:0]half/b16 VALU(16 位半寄存器)
HC64z1[63:41] f10[40:31] rs2[30:23] rs1[22:15] z0[14:13] rd[12:7] opcode[6:0]16 位比较 → uniform 掩码
UL64imm[63:32] f13[31:19] rs1[18:13] rd[12:7] opcode[6:0]uniform + 32 位 literal
M64imm[63:40] f2[39:38] cpol[37:35] sp[34:32] f5[31:27] rs2[26:21] rs1[20:14] rd[13:7] opcode[6:0]向量内存
UM64z[63:59] cpol[58:56] imm[55:32] f7[31:25] rs2[24:19] rs1[18:13] rd[12:7] opcode[6:0]uniform 标量内存
T64toff[63:52] z[51:50] d16[49:49] a16[48:48] rsd[47:47] voff[46:46] dmask[45:42] dim[41:38] rs3[37:32] f5[31:27] rs2[26:21] rs1[20:14] rd[13:7] opcode[6:0]texture / image

2.3 解码规则​

字 w 解码为某指令 iff (w & (mask | zero)) == match;mask 来自该指令的 fixed,zero 是所有既非固定又非操作数的字段位并集。任意两条同宽指令编码不重叠。勘误 v0.1.2:保留操作数编码(rm = 5/6、cpol = 4..7、lane7 ≥ 32、奇数寄存器对、未对齐 udesc4)不由解码器拒绝,而是在执行时报 IllegalInsn(cause 1,trapinfo = 指令低 32 位)。

2.4 操作数类型​

类型class位scale说明 / 取值
vregvreg7-向量寄存器 v0..v127
vpairvreg7-64 位向量对 v[2n:2n+1](偶对齐)
vreg16vreg8-16 位半:raw[7:1] 寄存器号、raw[0] 选半(0=.l / 1=.h)
uregureg6-uniform 寄存器 u0..u63
upairureg6-64 位 uniform 对 u[2n:2n+1]
udesc4ureg6-4-dword 描述符 u[4n:4n+3](buffer/sampler)
udesc8ureg6-8-dword 描述符 u[4n:4n+7](image)
simm8simm8-8 位有符号立即数(汇编值已乘 scale)
uimm8uimm8-8 位无符号立即数(汇编值已乘 scale)
simm10simm10-10 位有符号立即数(汇编值已乘 scale)
simm17simm17-17 位有符号立即数(汇编值已乘 scale)
simm18simm18-18 位有符号立即数(汇编值已乘 scale)
simm24simm24-24 位有符号立即数(汇编值已乘 scale)
imm32imm32-原始 32 位 literal(整数或 fp32 位模式)
uimm1uimm1-1 位无符号立即数(汇编值已乘 scale)
uimm3uimm3-3 位无符号立即数(汇编值已乘 scale)
uimm4uimm4-4 位无符号立即数(汇编值已乘 scale)
uimm6uimm6-6 位无符号立即数(汇编值已乘 scale)
uimm20uimm20-20 位无符号立即数(汇编值已乘 scale)
lane7uimm7-lane 号 0..31(32..127 保留)
attr7uimm7-属性槽 = location*4 + component
toff7uimm74tile 记录内 4 字节单位偏移
toff12uimm12-打包 texel 偏移:[3:0]=x [7:4]=y [11:8]=z(各 4 位有符号)
br22simm224PC 相对字节偏移(scale=4,相对本指令地址)
br19simm194PC 相对字节偏移(scale=4,相对本指令地址)
br17simm174PC 相对字节偏移(scale=4,相对本指令地址)
jofs10simm104加到寄存器目标的字节偏移(scale=4)
cnt_vmuimm6-waitcnt 的 vm 字段
cnt_texuimm5-waitcnt 的 tex 字段
cnt_vstuimm5-waitcnt 的 vst 字段
cnt_lsuimm4-waitcnt 的 ls 字段
cnt_sfuuimm3-waitcnt 的 sfu 字段
cnt_smuimm2-waitcnt 的 sm 字段
rmenum3-舍入模式:rne=0x0, rtz=0x1, rdn=0x2, rup=0x3, rmm=0x4, dyn=0x7
cpolenum3-cache 策略:def=0x0, nt=0x1, l2=0x2, sys=0x3
dimenum4-图像维度:1d=0x0, 2d=0x1, 3d=0x2, cube=0x3, 1darray=0x4, 2darray=0x5, cubearray=0x6, 2dms=0x7, 2dmsarray=0x8, buffer=0x9
csrenum10-CSR 编号:exec=0x0, mode=0x1, fflags=0x2, trapctl=0x3, warpid=0x10, spid=0x11, coreid=0x12, wgslot=0x13, clock=0x20, clockh=0x21, time=0x22, timeh=0x23, scratch_lo=0x30, scratch_hi=0x31, scratch_size=0x32, code_lo=0x33, code_hi=0x34, trapbase=0x40, trapcause=0x41, trappc=0x42, trapinfo=0x43
mod3uimm3-源修饰位:bit0=s1、bit1=s2、bit2=s3(先 abs 后 neg)
  • 寄存器写法:v5、u3;半寄存器 v5.l / v5.h;寄存器组 v[4:7]、u[8:15]。
  • simm/uimm 汇编值为十进制且已乘 scale;分支偏移 br22/br19/br17(scale=4)是相对本指令地址的有符号字节偏移;jofs10 加在寄存器目标上;toff7 以 4 字节为单位。
  • 枚举:rm = rne/rtz/rdn/rup/rmm/dyn(7);cpol = def/nt/l2/sys(4..7 保留);dim 见 §7;csr 编号见 §3.3。

2.5 谓词 / lane 模型​

没有独立的谓词寄存器文件。EXEC 是 u 侧的 32 位 lane 掩码:向量指令默认受 EXEC 门控,除非标有 exec_ignored(uniform、控制或显式 lane 操作)、reads_exec(把 EXEC 当数据输入)或 writes_exec(修改 EXEC)。比较与归约的结果掩码只含 EXEC 内的 lane(非活跃位为 0,见勘误 v0.1.2 对 16 位整数比较的补充)。wqm/exec.wqm 将掩码扩展到 2x2 quad(每 4 位一组,任一位置位则整组置位)。needs_wqm 指令要求 helper lane 活跃(whole-quad mode);功能模型不实现 WQM 执行模式,由软件保证。

2.6 异步操作与 waitcnt​

计数器位在途上限顺序覆盖
vm662in-order向量 load、返回原子、scratch load、L1/L2 invalidate
vst530in-order向量 store、非返回原子、image store/atomic、L2 writeback
tex530in-ordertexture sample/fetch/query、image load、返回 image atomic
ls414in-ordershared/tile memory、插值、zs.test
sm215out-of-orderuniform 标量 load(乱序;只有 0 有意义)
sfu36in-orderSFU 超越、除法、平方根
  • async:<counter> 指令发射时递增计数器,结果提交后递减;一条指令算一个挂起操作,多寄存器结果(含 16 位半寄存器,带位掩码只写所选一半)一次写回。
  • waitcnt 各字段是"允许保留的最老序号阈值":vm/vst/tex/ls/sfu 全 1(字段最大值)= 不等待,0 = 等待清空;sm 为 2 位:0 = 清空标量内存队列、3 = 不等待、1/2 保留并按 0 处理(勘误 v0.1.1)。在途上限以 YAML max_outstanding 为准(不能统一按 63),饱和时等同最老操作先完成(勘误 v0.1.2)。
  • 未用 waitcnt 隔开的两个挂起写回写同一寄存器(WAW),或读取有挂起写回的寄存器(RAW),结果对软件未定义。endpgm 按发射顺序完成全部挂起操作。
  • 内存序:普通 global/buffer 访问按 program order 发射;barrier 在 workgroup 内建立 release/acquire(只覆盖 workgroup 存活 warp);跨 workgroup / device / system 顺序须由编译器插入 waitcnt 与 cache 维护。L1 write-through、命中时更新,store 计数在 L2 确认后递减;cpol=def/nt/l2/sys = 默认 / non-temporal / 强制 L2 / 系统级可见;host-coherent 页不进 L2。