LLO操作码主表
此页面上的每个操作码值、助记符、插槽名称和地址都是从
libtpu-0.0.40-cp314轮中的libtpu.so中精确读取的字节(BuildID89edbbe81c5b328a958fe628a9f2207d,未剥离)。其他版本有所不同。
摘要
本附录是 LLO 操作码空间的单一综合参考表——重新实现者在构建 TPU 后端时保持打开的一个表。 LLO(低级优化器 IR)是 TPU 特定的后期编译器 IR,低于 MHLO/TLP,高于每代 TensorCore 捆绑编码器;它的内存操作码枚举 xla::jellyfish::LloOpcode 是一个密集、从零开始、461 个值编号(0x000..0x1CC),并且每个值都在位于 0x21ccfef0 的重定位 opcode_name 表中命名。每个家庭的权威事实都位于 isa/ 深层页面上;此页面将它们聚合到一个主操作码→助记符→插槽→语义→每代表中,并按每个操作码编码到的捆绑插槽(功能单元)进行分组。
该表按 槽族 组织,而不是按数字运行组织,因为值空间交错:LloOpcodeIsVector 是密集开关,而不是 >= threshold 测试,并且(例如)kVectorReadIar (1) 是向量,而 kLog (5) 不是向量。下面的每个插槽部分都枚举了每个插槽编码器序列化到该插槽中的操作码,其中包含数字 LloOpcode 值、单行语义以及各代的可用性(五个编解码器谱系:jxc Jellyfish/Dragonfish v2/v3、pxc Pufferfish v4、vfc/vxc Viperfish v5p、glc Ghostlite v6e、gfc 6acc60406 TPU7x)。位级字段编码(每个操作码的操作数位于 41/51/64 字节束中)此处“不”重复;它们位于每个插槽的深度页面上,每个部分都交叉链接。
三个索引空间不得与 LloOpcode 混淆,混淆它们的重新实现者会错误解码每个程序: LloOpcodeProto 线枚举(从 1 开始,最大 499,38 个保留间隙,请参阅 LloOpcode↔原型); LLVM-MC 发射器调度的 MC MCInst 操作码空间(LloOpcode + 499,门控 <= 0x1F2);和 GhPerf::Instruction 成本网格枚举。 LloOpcode 是所有其他地图来自的一张。针对二元分类器和转换器重新验证了此表中值的代表性样本(参见 验证);其中深层页面和二进制文件一致认为它们被视为已确认,并且没有发现任何分歧。
| 枚举 | xla::jellyfish::LloOpcode — 461 个枚举器,密集 0x000..0x1CC (0..460) |
| 名称访问器 | LloOpcodeName(LloOpcode) @ 0x1d631280 — 绑定 >= 0x1CD → ud1 |
| 姓名表 | opcode_name @ 0x21ccfef0 (461 × char*、R_X86_64_RELATIVE) |
| 属性字 | opcode_info @ 0x223a1320(461 × uint16:Push/Pop/Remat/Fold/Cse + reg 文件类) |
| 描述符 | opcode_info_big @ 0x227b5570(461 × 28 B:ResultFifo + ArchRegister 列表) |
| 系列分类器 | LloOpcodeIsVector @ 0x1d60c1c0; LloOpcodeIsScalar = !IsVector @ 0x1d60c7e0 |
| 电线转换器 | LloOpcodeToProto@0x14420020(表@0x344cb4c); ProtoToLloOpcode @ 0x14420040 |
| 信心 | 已确认(字节锚定),除非行另有说明 |
为了重新实现,该表支持的合约是:
- 操作码编号是世代不变的 — 相同的
LloOpcode值意味着每一代都有相同的操作码;每一代的变化是有效子集(稀疏度为 v5+,cmem-load 仅限 PF)和捆绑编码,而不是数量。 - 值占用的槽(每代编码器将其序列化到的捆绑字段)从每节列出的每槽分类器开关和编码器调度中恢复。
- 每代可用性列标记仅存在于给定代的操作码(F8 转换 PF+、随机轮 VF+、S4/U4 matmul PF+、BarnaCore 与 SparseCore 拆分)。
- 位编码被推迟到每槽深页;该表仅是值↔助记符↔槽↔语义。
老虎机系列一览
11 个功能单元系列划分了 461 个操作码(加上 33 个操作码 BarnaCore/SparseCore 块)。计数列是该家族拥有的不同 LloOpcode 值的数量;所属页面是记录该槽位编码的深层页面。值大多是连续的带;确切的成员位于下面的每个家庭部分。
| 插槽系列 | 值带 | 操作码 | 拥有深页 |
|---|---|---|---|
| 定序器/同步/FIFO 传输 | 0x000..0x030(交错) | ~50 | 定序器插槽 · 每代序列操作 |
| SPU /标量ALU和控制 | 0x085..0x089, 0x16B..0x1AA | 63 | SPU/标量插槽 |
| VPU /矢量ALU和逻辑 | 0x048..0x05A, 0x11B..0x1A2 | (295向量的子集) | VPU插槽 |
| 转换/打包/解包 | 0x05B..0x076, 0x107..0x11A, 0x125..0x127 | ~45 | VPU插槽 · EUP |
| EUP超越 | 0x128..0x14D | 38 | EUP / 超越插槽 |
| 跨车道/减少/XLU结果 | 0x036..0x03B, 0x0F5..0x101, 0x14E..0x155 | ~28 | 结果Fifo / ArchRegister |
| MXU matmul / 锁存器 / matprep / matres | 0x08D..0x0AB, 0x152..0x153 | ~33 | MXU 插槽 · 垫片准备/IAR/锁存器 |
| 内存加载/存储/IAR/RNG | 0x001..0x004, 0x030..0x046, 0x077..0x078 | ~30 | 内存加载 · 内存存储 · CMEM-负载 |
| DMA | 0x0B3..0x0DA(连续) | 40 | 定序器插槽(DMA 问题) |
| 谓词/掩码 | 0x0E1..0x0F1, 0x167..0x16A, 0x193..0x199 | ~18 | 谓词槽 · vcreate_mask |
| 常量/伪/调用 | 0x02C..0x02E, 0x0DB..0x0F4, 0x17C | ~25 | 立即槽 |
| BarnaCore(SparseCore) | 0x1AC..0x1CC(连续) | 33 | LLO 操作码枚举 |
| 稀疏性 (v5+) 结构化稀疏 | — | (开放) | 稀疏槽 (v5+) |
注意 — 稀疏槽尚未恢复。 结构化稀疏槽 (稀疏槽 (v5+)) 是 v5+/Viperfish 及更高版本的功能,其支持分析仍处于开放状态;尚未固定其明显的
LloOpcode值。列出它是为了完整性,但没有为下表贡献任何行。仅针对 v3/v4 的重新实现者可以完全忽略它。QUIRK — 461,而不是 462。 LLO 文档中浮动的“462”数字是
LloOpcodeProtowire 枚举(从 1 开始,值为 0 哨兵,最大 499,38 个间隙)。该表索引的内存中LloOpcode正是 461 个密集值 (0x000..0x1CC);LloOpcodeName在>= 0x1CD上捕获。关闭开关462并且最后一个索引读取元数据表。请参阅 LloOpcode↔原型。
定序器、同步和 FIFO 传输插槽 (0x000..0x030)
控制和握手层:程序边界、调度屏障、栅栏、周期计数器读取、暂停/让出以及在 SPU、VPU 和跨 FIFO 暂存寄存器之间移动值的标量/向量/同步标志结果 FIFO 推送/弹出原语。 PC 突变(分支/调用/停止)仅限于 Lane-0; v5+ 上的同步操作位于单独的 ScalarMisc 通道中。每(gen × 定序器类型)控制流名册位于 每代序列操作 上。
LloOpcode | 助记词 | 插槽/通道 | 语义 | 每代 |
|---|---|---|---|---|
0x000 | kEvent | 定序器 | 程序/跟踪事件标记 | 全部 |
0x005 | kLog | 定序器 | 调试日志标记(非矢量) | 全部 |
0x006/0x007 | kHloStart / kHloEnd | 定序器 | 源 HLO 跨度标记(调试信息) | 全部 |
0x008 | kSchedulingBarrier | 定序器 | 硬重排序障碍(否决 CSE 跨越它) | 全部 |
0x009 | kScalarToVector | V↔S桥 | 标量→矢量广播推送 | 全部 |
0x00A | kVectorToScalarPush | V→S 先进先出 | 矢量→标量 FIFO 推送(推送位) | 全部(v6e GhPerf 0x1DA) |
0x00B | kSyncFlagToScalarPush | 同步→S FIFO | 同步标志→标量 FIFO 推送 | 全部 |
0x00A..0x012 | kVectorToScalarPush … kDrfPop | V↔S / 同步 FIFO | V→S / 同步标志→标量推/弹出四重奏 | 全部 |
0x011/0x012 | kSfrfPop / kDrfPop | FIFO 弹出 | 同步标志结果 / divrem-结果 FIFO 弹出(弹出位) | 全部 |
0x013/0x014 | kScalarFence / kVectorStoreFence | 音序器/杂项 | 订购栅栏(存储栅栏 → gfc 上的杂项槽) | 全部 |
0x015..0x01C | kScalarCcfPush … kVectorCcfPopAsymmetrical | CCF FIFO | 跨核 FIFO 入栈/出栈(对称 + 非对称) | 全部 |
0x01D | kMegacoreSwapCoresPseudo | 定序器 | megacore核心交换伪 | 全部 |
0x01E | kCmemFence | 定序器 | CMEM 订购围栏 | PF+ |
0x01F..0x024 | kScalarReadCycleStart … kScalarReadCycleLow | 定序器 | 周期计数器读取/64 位低/高分割 | 全部 |
0x025..0x027 | kScalarHalt / …YieldConditional / …OnError | 序列器(通道 0) | 定序器停止变体(GhPerf 行 0x000) | 全部 |
0x029 | kProgramLaunchSc | 定序器 | SparseCore计划启动 | 全部 |
0x02B | kVectorInterrupt | 定序器 | 向量端中断 | 全部 |
注 — Push/Pop 是属性位,而不是操作码范围。
opcode_info位 0(推送)在*Push成员上设置,位 1(弹出)在*Pop成员上设置。调度程序通过读取这些位而不是数字范围测试来对 V2S/同步 FIFO 进行建模。kScalarHalt/kScalarHaltOnError共享GhPerf成本行0x000。
SPU/标量-ALU 插槽
标量控制 CPU 通道 — 32 项 SREG 文件、地址算术、分支/调用/选择、密集算术和移位尾部以及 V↔S FIFO 弹出。寄存器文件类字节(opcode_info 高字节)是 1(标量/掩码)。 Lane 0 拥有全套设备,包括。分支/呼叫;通道 1 是 ALU+halt 镜像。 SPU/标量插槽 上的位布局。
LloOpcode | 助记词 | 插槽 | 语义 |
|---|---|---|---|
0x077/0x078 | kScalarLoad / kScalarStore | 标量通道 | SMEM↔SREG内存访问(JF/PF上的lane-1绑定) |
0x085 | kScalarComposeU64 | 标量 | 将两个 u32 装入一个 u64 |
0x086 | kScalarAddressCalculation | 标量 | 地址算术(与 kScalarAddS32 共享 GhPerf 0x00C) |
0x087/0x088 | kScalarBranchRel / kScalarBranchInd | 序列器(通道 0) | 相对/间接分支 |
0x089 | kScalarSelect | 标量 | 标量条件选择 |
0x16B/0x16C | kScalarCompare / kScalarAddCarryU32 | 标量 | 比较+进位加法 |
0x16D..0x172 | kScalarMultiplyWordAddr … kScalarAddS32 | 标量 | 乘法 + 加法 (u24/u32/f32/s32) |
0x173..0x177 | kScalarSubtractS32 … kScalarBitwiseXor | 标量 | 减法 + 按位与/或/异或 |
0x178..0x17A | kScalarDivRemU32 / …U32AndPop / …RemU32AndPop | 标量 | 除法/余数(数据格式特殊情况) |
0x17B | kScalarMove | 标量 | 标量副本 — 移动排除(从不 CSE'd/rematted) |
0x17D..0x17F | kScalarFloorF32 / kScalarCeilF32 / kScalarCountLeadingZeros | 标量 | 标量舍入 + CLZ |
0x1A3..0x1A6 | kScalarShrl … kScalarShllOnes | 标量 | 逻辑/算术移位 |
0x1A7..0x1AA | kScalarMinimumF32 … kScalarMaximumU32 | 标量 | 最小值/最大值 (f32/u32) |
SPU是向量集(LloOpcodeIsScalar = !LloOpcodeIsVector)的补集,总共63个操作码; EncodingToScalarRegister (0x1e871e40) 将 SREG 选择器限制在 > 0x1F(32 个寄存器,5 位字段)——经过字节精确验证。每代跳转表大小是每代标量 ISA 大小(JF 0..0x3E、PF ≤0x33、VF ≤0x4C、GL/GF ≤0x49)。
VPU / 矢量 ALU 插槽
8 个子通道上的每通道向量 ALU × 128 通道 = 1024 元素 vreg。寄存器文件类字节 2(向量);可折叠/CSE 位(opcode_info bit5/bit6)在纯功能成员上设置。 LloOpcodeIsVectorUnop (0x1d60c200) / LloOpcodeIsVectorBinop (0x1d60c680) 拆分一元与二进制。 VPU插槽 上的位布局(6/7/8 位操作码,每代 5/4/2 位谓词)。
LloOpcode | 助记词 | 插槽 | 语义 |
|---|---|---|---|
0x048..0x050 | kVectorClampGezF32 … kVectorRemapBf16 | 值 | 钳位/重映射(gez、对称、非对称;F32/Bf16/S4) |
0x051..0x05A | kVectorMultiplyAccumulate … kVectorMoveEvenAccLow | 值 | MAC + 累加器移动(MAC 系列上的 FOLD 位) |
0x11B..0x124 | kVectorAddS32 … kVectorSubtractS16 | 值 | 加/减(s32/f32/bf16/s16,Bf16-hi/lo) |
0x156..0x15B | kVectorPowF32 … kVectorMultiplyBf16 | 值 | 乘法 + 乘法 (F32/U32/U16/Bf16) |
0x15C..0x15F | kVectorAndU32 … kVectorXorU32 | 值 | 按位与/与取反/或/异或 |
0x162..0x166 | kVectorMultiplyComposeU64 … kVectorExtractHigh32 | 值 | 64位乘法合成+字提取 |
0x180..0x184 | kVectorCountLeadingZeros … kVectorExtractSignificand | 值 | CLZ / move / popcount / FP 字段提取 |
0x181 | kVectorMove | 值 | 矢量副本 — 移动排除(从不 CSE'd/rematted) |
0x19A..0x19C | kVectorShiftRightLogical … kVectorShiftLeftLogical | 值 | 向量移位 |
0x19D..0x1A2 | kVectorMaximumF32 … kVectorMinimumU32 | 值 | 最小/最大 (F32/Bf16/U32) |
VALU是最大的家族;仅显示有代表性的谱带。 vmul.u32.u64 是 PF+ 槽对宽乘法。 VectorAluYEncoding (0..31) 源 B 选择器 — vreg / VS0-2 端口/硬连线浮点常量/立即槽 — 记录在 VPU 插槽 §Y 操作数 上。
转换/打包/解包
跨三个频段的类型转换:f32→{s32,f8,hf16} 和 {s8,s4,u8,u4}↔bf16、解包/舍入/截断块以及打包/组合。这些是几代人中获得最多的。
LloOpcode | 助记词 | 插槽 | 语义 | 每代 |
|---|---|---|---|---|
0x05B..0x060 | kScalarConvertF32ToS32WithProbRounding … …TowardsZeroPseudo | 值/标量 | F32→S32(概率圆/趋于零) | 全部 |
0x061..0x063 | kVectorConvertF32ToF8E5M2 / …E4M3Fn / …E4M3B11 | 值 | F32→F8 | PF+ |
0x064 | kVectorConvertF32ToHf16 | 值 | F32→Hf16 | 全部 |
0x066..0x06D | kVectorConvertS8ToBf16 … kVectorConvertBf16ToU4 | 值 | int↔Bf16 (s8/s4/u8/u4) | S4/U4 = PF+ |
0x06E/0x06F | kVectorConvertEXMYToE4M3 / …ToE5M2 | 值 | 通用 FP8 重新格式化 | PF+ |
0x070..0x074 | kVectorConvertF32ToE5M2Stochastic … …ToHf16Stochastic | 值 | 随机舍入转换 | VF+ |
0x107..0x10F | kScalarConvertS32ToF32 … kVectorDynamicUnpack | 值/标量 | S32→F32转换+解包(kVectorUnpack 0x109) + B2→B4 / B4→B8加入+ EXMY/动态 | 全部 |
0x110..0x11A | kVectorCeilF32 … kVectorTruncateBf16 | 值 | 舍入到整型/RTNA/RTNE/截断 | 全部 |
0x125..0x127 | kVectorComposeF32 / kVectorPack / kVectorPackEXMY | 值 | 组合 + 包 | 全部 |
EUP /超越插槽(0x128..0x14D)
扩展一元管道计算九个超越(tanh、pow2、reciprocal、log2、rsqrt、shifted-sigmoid、sinq、 cosq、erf)作为延迟结果管道:push(仅在 v5+ 上的 VALU 插槽 3)和稍后从 VectorResult 插槽的 pop。每个函数以四种 LLO 形式出现 - F32 仅发布、Bf16 仅发布、F32 发布 + 流行 (AndPop)、Bf16 发布 + 流行。 EUP / 超越插槽 上的选择器映射和延迟。
| 频段 | LloOpcode | 会员 | 表格 |
|---|---|---|---|
| 裸推F32 | 0x128..0x131 | Tanh/Pow2/Recip/Log2/Rsqrt/SigShft/Sinq/Cosq/Erf + kVectorPushErf | F32 仅发布(推送位) |
| 裸推Bf16 | 0x132..0x13A | 同款 | Bf16 仅发行 |
| 保险丝 F32 | 0x13B..0x144 | 同款+kVectorPushErfAndPop(0x144) | F32问题+流行(*AndPop) |
| 熔断 Bf16 | 0x145..0x14D | 同款 | Bf16问题+流行 |
| 延迟流行 | 0x14E | kVectorEupResult | pop EUP FIFO(弹出位,opcode_info=0x0202) |
代表性功能选择器值(5 位字段,gfc/glc @ 位 183): F32 tanh=0x13、rsqrt=0x10、pow2=0x11、 log2=0x12、sigmoid=0x14、reciprocal=0x15、sin=0x17、 cos=0x18, erf=0x0e; Bf16 选择器不同(例如 tanh=0x1b)。 18个*AndPop伪操作(不含0x144)被LloLateDecomposer拆分为裸推+延迟弹出; LloOpcodeIsPseudoEupInstruction (0x1d60c880) 通过 0x7FDFF 掩码对它们进行分类——经过字节精确验证。
注意 — EUP 系列是最干净的 Push/Pop 说明。 每个仅发布的 EUP 操作码都会设置
opcode_infobit0(Push);kVectorEupResult(0x14E) 设置 bit1 (Pop)。CreateVectorEupResult(0x1d4d9820) 在构建0x14Epop 之前断言压入操作数位于[0x128, 0x13A]中 — 已验证字节精确。
跨车道、Reduce 和 XLU-结果
跨通道置换/旋转/广播、整体/分段缩减(F32 和 Bf16 中的 min/max/add/argmin/argmax)以及延迟结果弹出(EUP、跨通道、置换、CMEM、转置、matmul)。 21 个 XLU 操作码由 ComputeXluOperations (0x126d9780) 遍历并发出 {TransposeTile, RpuOperation, XluControlOperation} 变体 — 请参阅 结果Fifo / ArchRegister。
LloOpcode | 助记词 | 插槽 | 语义 |
|---|---|---|---|
0x036..0x03B | kVectorPermute … kVectorBroadcastLane | XLU(装载槽) | 跨车道排列/旋转/组合/广播 |
0x08B/0x08C | kVectorSetPermutePattern / kVectorSetSegmentPattern | XLU控制 | 排列/分段模式设置 |
0x0F5..0x0FC | kVectorMinReduceF32 … kVectorAddSegmentReduceF32 | XLU(减少) | F32还原(整体+分段+索引) |
0x0FD..0x101 | kVectorMinReduceBf16 … kVectorMinIndexReduceBf16 | XLU(减少) | Bf16 减少 |
0x102..0x106 | kVectorSublaneId … kVectorLaneSequenceInterleavedB16 | 值 | 泳道/亚泳道身份序列(可重新匹配) |
0x14E | kVectorEupResult | 矢量结果 | 弹出 EUP 结果 FIFO |
0x14F..0x151 | kVectorXlaneResult / kVectorPermuteResult / kVectorCmemResult | 矢量结果 | 弹出 XLU/排列/CMEM 结果 FIFO |
0x152/0x153 | kVectorMatres / kVectorMatresAdd | 矢量结果 | 弹出 MXU 结果(普通/累加) |
0x154/0x155 | kVectorTransposeResult / kVectorTransposeClear | 矢量结果 | 弹出转置结果/清除转置 FIFO |
kVectorXlaneResult/kVectorPermuteResult/kVectorTransposeResult 共享 GhPerf 成本行 0x1C7。 kVectorTransposeClear (0x155) 是单个操作码,其 opcode_info 字为 0x000E。
MXU — Matmul、锁存器、Matprep、结果
脉动阵列运算系列:锁存固定权重,matprep 移动操作数,发出 matmul,通过 matres 排出。 Latch/matprep/matmul 共享 VectorExtended 插槽; matres 使用 VectorResult。 matmul band (0x8D..0xA5) 是在属性字读取之前 * 的特殊数据格式。 MXU 插槽 上的字段编码(每代 6→7→8 位操作码,−20/−21/−25 MXU 间孪生); 垫片准备/IAR/锁存器 上的锁存器/matprep 字段映射。
LloOpcode | 助记词 | 插槽 | 语义 | 生成器/分类器 |
|---|---|---|---|---|
0x08D | kVectorLatchLsf | 矢量扩展 | 锁存固定重量(从 FIFO 加载固定) | CreateVectorLatchLsf @ 0x1d4d7aa0 → New(141) |
0x08E | kVectorLatchLsfMsk | 矢量扩展 | 屏蔽 LSF 锁存器 | — |
0x08F..0x096 | kVectorLatch … kVectorLatch3Msk | 矢量扩展 | 增益矩阵锁存器(普通/1..3 子库,屏蔽) | CreateVectorLatchHelper |
0x097/0x098 | kVectorMatprepSubr (+Msk) | 矢量扩展 | 推移操作数,分行形式 | (op-151)<2 @ 0x1d60c400 |
0x099/0x09A | kVectorMatprepMubr (+Msk) | 矢量扩展 | 推移操作数,块行形式 | (op-153)<2 @ 0x1d60c3e0 |
0x09B | kVectorMatmul | 矢量扩展 | 一级收缩步 | EmitVectorMatmul @ 0x140b92c0 |
0x09C/0x0A0 | kVectorMatmulMubr (+Msk) | 矢量扩展 | 转换块行 matmul | ((op-156)&0xFFFB)==0 @ 0x1d60c3c0 |
0x09D/0x09E | kVectorMatmulHigh / kVectorMatmulLow | 矢量扩展 | 高半/低半累加器步长 | EmitVectorMatmul |
0x09F..0x0A5 | kVectorMatmulMsk … kVectorMatmulLmr | 矢量扩展 | 掩蔽/封装 (kVectorMatmulPacked 0x0A3)/LMR 融合 matmul | — |
0x0A6/0x0A7 | kVectorTranspose / kVectorTransposeBinary | 矢量扩展 | XLU 转置(已调度 vxpose 模式) | — |
0x0A8..0x0AB | kVectorDoneWithGains … kVectorLoadLmrWithBf16Conversion | 矢量扩展 | 增益握手+GMR/LMR负载 | — |
0x152/0x153 | kVectorMatres / kVectorMatresAdd | 矢量结果 | matmul结果集合(普通/累加) | a3 != 338 @ EmitVectorMatres |
Per-gen dtype set:PF/VF/GL携带8种格式{F32, If8, Bf16, Bf8} × float + {U8, S8, U4, S4} × int; gfc (v6e) 是仅浮动 4 格式 {F32, E4m3, Bf16, E5m2}。每个 TensorCore 的 MXU:1 (JF) / 4 (PF, VF) / 2 (GL, gfc)。 MSR 银行:1 (JF/PF) / 2 (VF/GL/gfc)。
GOTCHA — matmul 推送位取决于数据格式,而不是静态的。
LloInstructionPushesToResultFifo通过位掩码测试 matmul 带 (0x8D..0xA5) 并路由到matmul_data_formatvtable 调用;从opcode_info[op]读取 matmul 操作码的静态 Push 位会导致错误的 FIFO 行为。推送取决于指令实例决定的数据格式。
内存加载/存储/IAR/RNG
每通道索引地址寄存器 (IAR) 设置、每通道 PRNG 和加载/存储槽。层(VMEM/SMEM/CMEM/SPMEM)是通过操作占用的“哪个插槽”而不是层位来选择的。 CMEM-load 是专用的仅 PF 插槽。 内存加载、内存存储、CMEM-负载(PF) 上的位布局。
LloOpcode | 助记词 | 插槽 | 语义 | 每代 |
|---|---|---|---|---|
0x001 | kVectorReadIar | 负载槽 | 将索引地址寄存器读入 vreg | 全部 |
0x002..0x004 | kVectorSetIarLane / …Raw / …Sublane | 商店插槽 | 设置 IAR(通道/原始/子通道;LLO≠时隙操作码) | 全部 |
0x030..0x035 | kVectorLoadSublaneShuffle … kVectorCmemLoadAndPop | 负载槽 | 向量+CMEM负载 | 全部(CMEM = PF) |
0x03C..0x03E | kVectorPrng / kVectorSetRngSeed / kVectorGetRngSeed | VALU/店 | 每通道 PRNG(种子随机转换) | 全部 |
0x03F..0x046 | kVectorStore … kVectorStoreEvenOddSublanes | 商店插槽 | 向量 + CMEM 存储(索引/屏蔽/随机/奇偶) | 全部 |
0x047 | kVectorNop | 值 | 矢量无操作(与 kVectorMaskMove 共享 GhPerf 0x1B4) | 全部 |
0x077/0x078 | kScalarLoad / kScalarStore | 标量通道 | SMEM 标量访问 | 全部 |
按 LloOpcodeIsVectorStore (0x14024920) 分类的存储窗口是内部 {63,64,65,68,69,70} ∪ {460} — 已验证字节精确 ((op-63)<=7 && _bittest(0xE7, op-63) || op==460)。加载窗口 LloOpcodeIsVectorLoad (0x14024900) 是 {48..51} ∪ {457,458} — 已验证字节精确。每一代 IarsPerTensorCore = 2。
Ghostlite 性能分类器 (GetGhostliteInstruction @ 0x1c8b1740) 对 IAR 存在的哨兵上的索引内存操作进行键控;七个 IAR 类操作码是字节精确的(用作 IAR op-id 基本事实):
LloOpcode | 助记词 | 角色 |
|---|---|---|
0x001 | kVectorReadIar | 将 IAR 排入 vreg |
0x002 | kVectorSetIarLane | 设置IAR(车道模式) |
0x003 | kVectorSetIarRaw | 设置IAR(原始模式) |
0x004 | kVectorSetIarSublane | 设置IAR(子通道模式) |
0x032 | kVectorLoadIndexed | 聚VMEM[底座+IAR] |
0x040 | kVectorStoreIndexed | 分散到 VMEM[base + IAR] |
0x044 | kVectorStoreIndexedMasked | 掩蔽散射 |
QUIRK — LLO IAR 操作码编号和捆绑插槽 IAR 操作码不对齐。 LLO
kVectorSetIarRaw(0x03) 映射到 ISA 插槽操作码 4,LLOkVectorSetIarSublane(0x04) 映射到插槽操作码 3 —子通道/原始编码交叉。假设 LLO-opcode == slot-opcode 的重新实现会交换它们。请参阅 Matprep/IAR/Latch §IAR。
DMA (0x0B3..0x0DA)
40 个连续 DMA 操作码 — 最大的单个连续块 — 枚举方向(HBM/VMEM/SMEM/CMEM/HIB/IMEM/主机 + IOVA 主机)× 源/目标寄存器变体 + WithHibUpdate 系列 + 两个终结符。 DMA 通过描述符从定序器/标量通道发出;没有设置结果 FIFO 压入/弹出位(opcode_info 低字节 0x00)。
LloOpcode | 助记词 | 语义 |
|---|---|---|
0x0B3/0x0B4 | kDmaGeneral / kDma | 通用 DMA 形式 |
0x0B5..0x0CC | kDmaHbmToVmem … kDmaSmemToVmem | 方向矩阵(HBM/VMEM/SMEM/CMEM/HIB/IMEM) |
0x0CD..0x0D0 | kDmaHbmToVmemWithHibUpdate … …VdstWithHibUpdate | HBM→具有 HIB 更新的 VMEM |
0x0D1..0x0D8 | kDmaHbmToHost … kDmaSmemToHostIova | 主机DMA(直接+IOVA) |
0x0D9/0x0DA | kDmaDone / kDmaDoneWait | DMA完成/等待 |
注意 — 成本模型按方向级别对 DMA 进行定价。 14 个 HBM/Host-DMA 操作码折叠到 GhPerf 行 0x40,14 个 VMEM/SMEM-DMA 操作码折叠到行 0x43; 40 个不同的
LloOpcode值都存在,但延迟模型将每个方向族视为一个。
谓词/掩码槽
标量谓词(1 位 Preg、P0..P14/15)和每通道向量掩码(Vmreg、M0..M31)操作 — 两个物理上不同的寄存器文件。比较操作产生一个掩码;选择消耗一个。 没有原生谓词-AND(通过 De Morgan 合成)。 谓词槽 上的位布局; vcreate_mask 上的 M 寄存器矩形。
LloOpcode | 助记词 | 插槽 | 语义 |
|---|---|---|---|
0x0E1 | kPredicateConstant | 谓词 | 可重新设置谓词常量 (opcode_info=0x00D0) |
0x0E2/0x0E3 | kVectorMaskConstant / …Packed | 面罩 | 掩码常数 |
0x0E5..0x0E8 | kPredicateNegate … kPredicateOr | 谓词 | 谓词逻辑(共享 GhPerf 行 0x032) |
0x0E6 | kPredicateMove | 谓词 | 谓词复制 — 移动排除 |
0x167..0x16A | kVectorCompare … kVectorAddCarryU16 | 面罩 | 掩模生成比较+加进位 |
0x193..0x199 | kVectorMaskXor … kVectorMaskMove | 面罩 | 掩码逻辑/包压缩/否定/移动 |
0x195 | kVectorMaskAnd | 面罩 | 掩模AND(合成矩形组合) |
0x198 | kVectorMaskNegate | 面罩 | 面膜补充品 |
0x199 | kVectorMaskMove | 面罩 | 掩码副本 — 移动排除 |
四个移动排除操作码 — kScalarMove (0x17B)、kVectorMove (0x181)、kVectorMaskMove (0x199)、kPredicateMove (0xE6) — 被 CSE/remat/fold 通道跳过。原生 vcreate_mask 仅存在于 VF/GL 上(通过 JF/DF/PF 上的 iota-compare 合成)。
常量、伪值和调用
常量、Phi/伪 SSA 节点和调用/元组组。常量设置remat位(opcode_info 0x50); Phi 节点短路至成本 0。地址实现可重新设置。文字通过直接槽路由 - 请参阅 立即槽。
LloOpcode | 助记词 | 语义 |
|---|---|---|
0x02C..0x02E | kAllocationAddress / kParameterAddress / kIntToPtr | 地址物化(可重格式化) |
0x0DB..0x0E0 | kScalarConstantU32 … kVectorConstantF32 | 标量/矢量常量 (U32/PackedBf16/F32) |
0x0E4 | kVectorConstantU64 | 64位向量常量 |
0x0E9..0x0EC | kPredicatePhi / kScalarPhi / kVectorPhi / kVectorMaskPhi | SSA phi 节点(成本 0) |
0x0ED..0x0F0 | kTuple / kInlinedCall / kCall / kInlinedCallOperand | 调用/元组结构 |
0x0F1..0x0F4 | kPredicatePseudo … kVectorMaskPseudo | 每个寄存器类的伪占位符 |
0x17C | kRelocatableConstant | 链接时间重定位常量 |
BarnaCore(SparseCore)块(0x1AC..0x1CC)
33 个最高操作码是 BarnaCore (SparseCore) 指令集 — 嵌入分散/聚集、稀疏归约、远程标量写入和 BarnaCore 本地向量加载/存储/移动。这些是 LLVM-MC 发射器实际编码的操作码(其填充的 InstBits_BarnaCorePxcHwMode 表涵盖此范围),与返回全零的 TensorCore 操作码不同。 SparseCore 标量/矢量操作码枚举(每个引擎的 SCS/TAC/TEC 标量 ALU 和矢量 ALU 名册)是独立的引擎系列枚举,具有自己的深层页面 - 请参阅 SPU/标量插槽§SparseCore 和 VPU插槽。
LloOpcode | 助记词 | 语义 |
|---|---|---|
0x1AC..0x1B3 | kBarnaCoreScalarWaitDone … kBarnaCoreScalarWaitNe | 标量等待/同步原语 |
0x1B4..0x1B7 | kBarnaCoreScalarSyncDoneRead … …SyncPublicAccessWrite | 同步标志读/写 |
0x1B8..0x1BB | kBarnaCoreScalarPop … kBarnaCoreDma | 弹出/FSM问题/围栏(kBarnaCoreScalarFence 0x1BA)/DMA |
0x1BC..0x1C8 | kBarnaCoreRemoteScalarWrite … kBarnaCorePfLocalScatterGradients | 远程写入/分散-聚集/稀疏-减少 |
0x1C9..0x1CC | kBarnaCoreVectorLoad … kBarnaCoreVectorStore | BarnaCore 矢量加载/存储/移动 |
QUIRK — BarnaCore 向量加载/存储操作码 (457..460) 测试为 向量;标量/同步 (428..456) 测试为非矢量。 这是 BarnaCore 块跨越矢量/标量分区的唯一位置,对于寄存器类选择很重要。选择SparseCore引擎编解码器的TpuSequencerType枚举是
kTensorCoreSequencer(0)..kSparseCoreTileExecuteSequencer(5);TpuSequencerTypeFromProto(0x20b36300) 映射原型 1..6 → 内部 0..5 — 已验证字节精确。 BarnaCore 是 v5 之前的构造(JF 地址处理程序、PF 定序器);从 v5 开始,SparseCore (SCS/TAC/TEC) 取代了它,6acc60406 (v7x) 放弃了 TAC 引擎。
每代可用性摘要
LloOpcode 编号是世代不变的;每个硅片的有效子集都会增长。代号→命名空间映射:jxc = Jellyfish (jellyfish::isa) + Dragonfish (别名); pxc = 河豚; vxc/vfc = 毒蛇鱼; glc=幽灵灯; gfc = 6acc60406。
| 一代 | 代号 | LloOpcode 比上一代增加 |
|---|---|---|
| TPU v2 / v3 | 水母/龙鱼 | 基本集(原始直接编码,无紧凑型编码器) |
| TPU v4 | 河豚 | F8 转换 (0x061..0x063)、S4/U4 int↔Bf16 (0x067/0x069/0x06B/0x06D)、 kCmemFence (0x01E)、CMEM DMA/加载/存储 |
| TPU v5e | 毒蛇鱼 | 随机舍入转换(0x070..0x074); SparseCore SCS/TAC/TEC 引擎;原生vcreate_mask |
| TPU v6e | Ghostlite | vector_misc 插槽操作;合并VectorSelect; 2 个矢量存储写入端口 |
| TPU7x | 6acc60406 | 双矩阵分级(MSRA/MSRB);仅浮点数 FP8 matmul 重新映射;双谓词槽;下降 TAC 发动机、产量机械 |
注意 — 附加和插入,而不是仅附加。 新操作码被“插入”到内存中
LloOpcode的自然位置(保持系列连续),但“附加”到LloOpcodeProto线枚举的末尾(保留线兼容性)。这就是为什么 proto 498/499 映射到低内存操作码 (0x084/0x197) — 经过字节精确验证。移植实际的LloOpcodeToProto表 (0x344cb4c),而不是公式。请参阅 LloOpcode↔原型。
验证来源 {#verification-provenance}
该表的值↔助记符↔槽绑定的代表性示例直接基于二进制文件(分类器、构建器、转换器)。探测(所有已确认字节精确):
| 探头 | 二进制事实 | 确认 |
|---|---|---|
LloOpcodeName @ 0x1d631280 | 绑定 >= 0x1CD → ud1;索引 opcode_name @ 0x21ccfef0 | 461密集枚举器 |
opcode_info / opcode_info_big 符号 | 0x223a1320 / 0x227b5570 按名称解析 | 元数据表地址 |
LloOpcodeIsVectorStore @ 0x14024920 | (op-63)<=7 && _bittest(0xE7,op-63) || op==460 | 商店橱窗 {63,64,65,68,69,70,460} |
LloOpcodeIsVectorLoad @ 0x14024900 | (op-48)<4 || (op-457)<2 | 加载窗口 {48..51,457,458} |
LloOpcodeIsVectorMatprepSubr/Mubr/MatmulMubr | (op-151)<2 / (op-153)<2 / ((op-156)&0xFFFB)==0 | 垫片准备 0x97/0x98、0x99/0x9a; matmul-mubr 0x9c/0xa0 |
EmitVectorMatres | a3 != 338 防护罩 | kVectorMatres = 0x152 (338) |
CreateVectorLatchLsf @ 0x1d4d7aa0 | New(141, …) | kVectorLatchLsf = 0x8D (141) |
LloOpcodeIsPseudoEupInstruction @ 0x1d60c880 | (op-315)<0x13 & (0x7FDFF >> (op-59)) | 融合 EUP 带 0x13B..0x14D 减去 0x144 |
CreateVectorEupResult @ 0x1d4d9820 | 断言推送操作码 (op-296) < 0x13 | EUP 推范围 [0x128,0x13A] → 流行 0x14E |
EncodeTensorCoreVectorAlu3F32Tanh (gfc) | op=0 @194/w8,sel=19 @183/w5,src @188/w6 | F32 Tanh 选择器 0x13 |
EncodingToScalarRegister @ 0x1e871e40 | 绑定 > 0x1F → 错误 | 32深度SREG文件(5位) |
TpuSequencerTypeFromProto @ 0x20b36300 | 原型 1..6 → 内部 0..5 开关 | 6 值排序器类型枚举 |
LloOpcodeToProto @ 0x14420020 | GOT相关表@ 0x344cb4c | 正向图是平面查找 |
ProtoToLloOpcode @ 0x14420040 | 499臂开关;原始 497→460、498→132、499→407; 38 __debugbreak 手臂 | 反向图+38个预留间隙 |
交叉引用
- LLO 操作码枚举 — 主系列分类、
opcode_info/opcode_info_big元数据表以及此表合并的每个系列值范围。 - 每代定序器操作 — 每代(代 × 定序器类型)控制流操作清单和
TpuSequencerType枚举。 - InstBits 主数据库 — 仅编码 BarnaCore 子集的 LLVM-MC 基位表(
opcode − 499索引)。 - LloOpcode↔原型 — 线值转换器和 38 个保留的原型间隙。
- 结果Fifo / ArchRegister — FIFO 和物理寄存器枚举 XLU/结果弹出操作码参考。
- MXU 插槽 · 垫片准备/IAR/锁存器 — matmul/latch/matprep/matres 位编码和 IAR。
- VPU插槽 · EUP / 超越插槽 — 矢量 ALU 和先验推入/弹出编码。
- SPU/标量插槽 · 定序器插槽 — 标量 ALU 和 PC 突变编码。
- 内存加载 · 内存存储 · CMEM-负载(PF) — 加载/存储/IAR 插槽编码和逐插槽模型。
- 谓词槽 · vcreate_mask / M-寄存器 — 标量谓词和向量掩码寄存器文件。
- 立即槽 · 环路/LCC · 稀疏槽 (v5+) — 立即池、循环计数器和(开放的)稀疏槽。
- LLVM-TPU 本质表 —
llvm.tpu.*内在函数的兄弟附录,降低到这些操作码。 - 每代比较矩阵 — 合并每代 ISA 增量的同级附录。