Skip to content

LLO操作码主表

此页面上的每个操作码值、助记符、插槽名称和地址都是从 libtpu-0.0.40-cp314 轮中的 libtpu.so 中精确读取的字节(BuildID 89edbbe81c5b328a958fe628a9f2207d,未剥离)。其他版本有所不同。

摘要

本附录是 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 — 绑定 >= 0x1CDud1
姓名表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 @ 0x1d60c1c0LloOpcodeIsScalar = !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..0x1AA63SPU/标量插槽
VPU /矢量ALU和逻辑0x048..0x05A, 0x11B..0x1A2(295向量的子集)VPU插槽
转换/打包/解包0x05B..0x076, 0x107..0x11A, 0x125..0x127~45VPU插槽 · EUP
EUP超越0x128..0x14D38EUP / 超越插槽
跨车道/减少/XLU结果0x036..0x03B, 0x0F5..0x101, 0x14E..0x155~28结果Fifo / ArchRegister
MXU matmul / 锁存器 / matprep / matres0x08D..0x0AB, 0x152..0x153~33MXU 插槽 · 垫片准备/IAR/锁存器
内存加载/存储/IAR/RNG0x001..0x004, 0x030..0x046, 0x077..0x078~30内存加载 · 内存存储 · CMEM-负载
DMA0x0B3..0x0DA(连续)40定序器插槽(DMA 问题)
谓词/掩码0x0E1..0x0F1, 0x167..0x16A, 0x193..0x199~18谓词槽 · vcreate_mask
常量/伪/调用0x02C..0x02E, 0x0DB..0x0F4, 0x17C~25立即槽
BarnaCore(SparseCore)0x1AC..0x1CC(连续)33LLO 操作码枚举
稀疏性 (v5+) 结构化稀疏(开放)稀疏槽 (v5+)

注意 — 稀疏槽尚未恢复。 结构化稀疏槽 (稀疏槽 (v5+)) 是 v5+/Viperfish 及更高版本的功能,其支持分析仍处于开放状态;尚未固定其明显的 LloOpcode 值。列出它是为了完整性,但没有为下表贡献任何行。仅针对 v3/v4 的重新实现者可以完全忽略它。

QUIRK — 461,而不是 462。 LLO 文档中浮动的“462”数字是 LloOpcodeProto wire 枚举(从 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助记词插槽/通道语义每代
0x000kEvent定序器程序/跟踪事件标记全部
0x005kLog定序器调试日志标记(非矢量)全部
0x006/0x007kHloStart / kHloEnd定序器源 HLO 跨度标记(调试信息)全部
0x008kSchedulingBarrier定序器硬重排序障碍(否决 CSE 跨越它)全部
0x009kScalarToVectorV↔S桥标量→矢量广播推送全部
0x00AkVectorToScalarPushV→S 先进先出矢量→标量 FIFO 推送(推送位)全部(v6e GhPerf 0x1DA)
0x00BkSyncFlagToScalarPush同步→S FIFO同步标志→标量 FIFO 推送全部
0x00A..0x012kVectorToScalarPushkDrfPopV↔S / 同步 FIFOV→S / 同步标志→标量推/弹出四重奏全部
0x011/0x012kSfrfPop / kDrfPopFIFO 弹出同步标志结果 / divrem-结果 FIFO 弹出(弹出位)全部
0x013/0x014kScalarFence / kVectorStoreFence音序器/杂项订购栅栏(存储栅栏 → gfc 上的杂项槽)全部
0x015..0x01CkScalarCcfPushkVectorCcfPopAsymmetricalCCF FIFO跨核 FIFO 入栈/出栈(对称 + 非对称)全部
0x01DkMegacoreSwapCoresPseudo定序器megacore核心交换伪全部
0x01EkCmemFence定序器CMEM 订购围栏PF+
0x01F..0x024kScalarReadCycleStartkScalarReadCycleLow定序器周期计数器读取/64 位低/高分割全部
0x025..0x027kScalarHalt / …YieldConditional / …OnError序列器(通道 0)定序器停止变体(GhPerf 行 0x000)全部
0x029kProgramLaunchSc定序器SparseCore计划启动全部
0x02BkVectorInterrupt定序器向量端中断全部

注 — 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/0x078kScalarLoad / kScalarStore标量通道SMEM↔SREG内存访问(JF/PF上的lane-1绑定)
0x085kScalarComposeU64标量将两个 u32 装入一个 u64
0x086kScalarAddressCalculation标量地址算术(与 kScalarAddS32 共享 GhPerf 0x00C)
0x087/0x088kScalarBranchRel / kScalarBranchInd序列器(通道 0)相对/间接分支
0x089kScalarSelect标量标量条件选择
0x16B/0x16CkScalarCompare / kScalarAddCarryU32标量比较+进位加法
0x16D..0x172kScalarMultiplyWordAddrkScalarAddS32标量乘法 + 加法 (u24/u32/f32/s32)
0x173..0x177kScalarSubtractS32kScalarBitwiseXor标量减法 + 按位与/或/异或
0x178..0x17AkScalarDivRemU32 / …U32AndPop / …RemU32AndPop标量除法/余数(数据格式特殊情况)
0x17BkScalarMove标量标量副本 — 移动排除(从不 CSE'd/rematted)
0x17D..0x17FkScalarFloorF32 / kScalarCeilF32 / kScalarCountLeadingZeros标量标量舍入 + CLZ
0x1A3..0x1A6kScalarShrlkScalarShllOnes标量逻辑/算术移位
0x1A7..0x1AAkScalarMinimumF32kScalarMaximumU32标量最小值/最大值 (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..0x050kVectorClampGezF32kVectorRemapBf16钳位/重映射(gez、对称、非对称;F32/Bf16/S4)
0x051..0x05AkVectorMultiplyAccumulatekVectorMoveEvenAccLowMAC + 累加器移动(MAC 系列上的 FOLD 位)
0x11B..0x124kVectorAddS32kVectorSubtractS16加/减(s32/f32/bf16/s16,Bf16-hi/lo)
0x156..0x15BkVectorPowF32kVectorMultiplyBf16乘法 + 乘法 (F32/U32/U16/Bf16)
0x15C..0x15FkVectorAndU32kVectorXorU32按位与/与取反/或/异或
0x162..0x166kVectorMultiplyComposeU64kVectorExtractHigh3264位乘法合成+字提取
0x180..0x184kVectorCountLeadingZeroskVectorExtractSignificandCLZ / move / popcount / FP 字段提取
0x181kVectorMove矢量副本 — 移动排除(从不 CSE'd/rematted)
0x19A..0x19CkVectorShiftRightLogicalkVectorShiftLeftLogical向量移位
0x19D..0x1A2kVectorMaximumF32kVectorMinimumU32最小/最大 (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..0x060kScalarConvertF32ToS32WithProbRounding…TowardsZeroPseudo值/标量F32→S32(概率圆/趋于零)全部
0x061..0x063kVectorConvertF32ToF8E5M2 / …E4M3Fn / …E4M3B11F32→F8PF+
0x064kVectorConvertF32ToHf16F32→Hf16全部
0x066..0x06DkVectorConvertS8ToBf16kVectorConvertBf16ToU4int↔Bf16 (s8/s4/u8/u4)S4/U4 = PF+
0x06E/0x06FkVectorConvertEXMYToE4M3 / …ToE5M2通用 FP8 重新格式化PF+
0x070..0x074kVectorConvertF32ToE5M2Stochastic…ToHf16Stochastic随机舍入转换VF+
0x107..0x10FkScalarConvertS32ToF32kVectorDynamicUnpack值/标量S32→F32转换+解包(kVectorUnpack 0x109) + B2→B4 / B4→B8加入+ EXMY/动态全部
0x110..0x11AkVectorCeilF32kVectorTruncateBf16舍入到整型/RTNA/RTNE/截断全部
0x125..0x127kVectorComposeF32 / kVectorPack / kVectorPackEXMY组合 + 包全部

EUP /超越插槽(0x128..0x14D)

扩展一元管道计算九个超越(tanhpow2reciprocallog2rsqrtshifted-sigmoidsinqcosqerf)作为延迟结果管道:push(仅在 v5+ 上的 VALU 插槽 3)和稍后从 VectorResult 插槽的 pop。每个函数以四种 LLO 形式出现 - F32 仅发布、Bf16 仅发布、F32 发布 + 流行 (AndPop)、Bf16 发布 + 流行。 EUP / 超越插槽 上的选择器映射和延迟。

频段LloOpcode会员表格
裸推F320x128..0x131Tanh/Pow2/Recip/Log2/Rsqrt/SigShft/Sinq/Cosq/Erf + kVectorPushErfF32 仅发布(推送位)
裸推Bf160x132..0x13A同款Bf16 仅发行
保险丝 F320x13B..0x144同款+kVectorPushErfAndPop(0x144)F32问题+流行(*AndPop)
熔断 Bf160x145..0x14D同款Bf16问题+流行
延迟流行0x14EkVectorEupResultpop EUP FIFO(弹出位,opcode_info=0x0202)

代表性功能选择器值(5 位字段,gfc/glc @ 位 183): F32 tanh=0x13rsqrt=0x10pow2=0x11log2=0x12sigmoid=0x14reciprocal=0x15sin=0x17cos=0x18, erf=0x0e; Bf16 选择器不同(例如 tanh=0x1b)。 18个*AndPop伪操作(不含0x144)被LloLateDecomposer拆分为裸推+延迟弹出; LloOpcodeIsPseudoEupInstruction (0x1d60c880) 通过 0x7FDFF 掩码对它们进行分类——经过字节精确验证。

注意 — EUP 系列是最干净的 Push/Pop 说明。 每个仅发布的 EUP 操作码都会设置 opcode_info bit0(Push); kVectorEupResult (0x14E) 设置 bit1 (Pop)。 CreateVectorEupResult (0x1d4d9820) 在构建 0x14E pop 之前断言压入操作数位于 [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..0x03BkVectorPermutekVectorBroadcastLaneXLU(装载槽)跨车道排列/旋转/组合/广播
0x08B/0x08CkVectorSetPermutePattern / kVectorSetSegmentPatternXLU控制排列/分段模式设置
0x0F5..0x0FCkVectorMinReduceF32kVectorAddSegmentReduceF32XLU(减少)F32还原(整体+分段+索引)
0x0FD..0x101kVectorMinReduceBf16kVectorMinIndexReduceBf16XLU(减少)Bf16 减少
0x102..0x106kVectorSublaneIdkVectorLaneSequenceInterleavedB16泳道/亚泳道身份序列(可重新匹配)
0x14EkVectorEupResult矢量结果弹出 EUP 结果 FIFO
0x14F..0x151kVectorXlaneResult / kVectorPermuteResult / kVectorCmemResult矢量结果弹出 XLU/排列/CMEM 结果 FIFO
0x152/0x153kVectorMatres / kVectorMatresAdd矢量结果弹出 MXU 结果(普通/累加)
0x154/0x155kVectorTransposeResult / 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助记词插槽语义生成器/分类器
0x08DkVectorLatchLsf矢量扩展锁存固定重量(从 FIFO 加载固定)CreateVectorLatchLsf @ 0x1d4d7aa0New(141)
0x08EkVectorLatchLsfMsk矢量扩展屏蔽 LSF 锁存器
0x08F..0x096kVectorLatchkVectorLatch3Msk矢量扩展增益矩阵锁存器(普通/1..3 子库,屏蔽)CreateVectorLatchHelper
0x097/0x098kVectorMatprepSubr (+Msk)矢量扩展推移操作数,分行形式(op-151)<2 @ 0x1d60c400
0x099/0x09AkVectorMatprepMubr (+Msk)矢量扩展推移操作数,块行形式(op-153)<2 @ 0x1d60c3e0
0x09BkVectorMatmul矢量扩展一级收缩步EmitVectorMatmul @ 0x140b92c0
0x09C/0x0A0kVectorMatmulMubr (+Msk)矢量扩展转换块行 matmul((op-156)&0xFFFB)==0 @ 0x1d60c3c0
0x09D/0x09EkVectorMatmulHigh / kVectorMatmulLow矢量扩展高半/低半累加器步长EmitVectorMatmul
0x09F..0x0A5kVectorMatmulMskkVectorMatmulLmr矢量扩展掩蔽/封装 (kVectorMatmulPacked 0x0A3)/LMR 融合 matmul
0x0A6/0x0A7kVectorTranspose / kVectorTransposeBinary矢量扩展XLU 转置(已调度 vxpose 模式)
0x0A8..0x0ABkVectorDoneWithGainskVectorLoadLmrWithBf16Conversion矢量扩展增益握手+GMR/LMR负载
0x152/0x153kVectorMatres / 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_format vtable 调用;从 opcode_info[op] 读取 matmul 操作码的静态 Push 位会导致错误的 FIFO 行为。推送取决于指令实例决定的数据格式。


内存加载/存储/IAR/RNG

每通道索引地址寄存器 (IAR) 设置、每通道 PRNG 和加载/存储槽。层(VMEM/SMEM/CMEM/SPMEM)是通过操作占用的“哪个插槽”而不是层位来选择的。 CMEM-load 是专用的仅 PF 插槽。 内存加载内存存储CMEM-负载(PF) 上的位布局。

LloOpcode助记词插槽语义每代
0x001kVectorReadIar负载槽将索引地址寄存器读入 vreg全部
0x002..0x004kVectorSetIarLane / …Raw / …Sublane商店插槽设置 IAR(通道/原始/子通道;LLO≠时隙操作码)全部
0x030..0x035kVectorLoadSublaneShufflekVectorCmemLoadAndPop负载槽向量+CMEM负载全部(CMEM = PF)
0x03C..0x03EkVectorPrng / kVectorSetRngSeed / kVectorGetRngSeedVALU/店每通道 PRNG(种子随机转换)全部
0x03F..0x046kVectorStorekVectorStoreEvenOddSublanes商店插槽向量 + CMEM 存储(索引/屏蔽/随机/奇偶)全部
0x047kVectorNop矢量无操作(与 kVectorMaskMove 共享 GhPerf 0x1B4)全部
0x077/0x078kScalarLoad / 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助记词角色
0x001kVectorReadIar将 IAR 排入 vreg
0x002kVectorSetIarLane设置IAR(车道模式)
0x003kVectorSetIarRaw设置IAR(原始模式)
0x004kVectorSetIarSublane设置IAR(子通道模式)
0x032kVectorLoadIndexed聚VMEM[底座+IAR]
0x040kVectorStoreIndexed分散到 VMEM[base + IAR]
0x044kVectorStoreIndexedMasked掩蔽散射

QUIRK — LLO IAR 操作码编号和捆绑插槽 IAR 操作码不对齐。 LLO kVectorSetIarRaw (0x03) 映射到 ISA 插槽操作码 4,LLO kVectorSetIarSublane (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/0x0B4kDmaGeneral / kDma通用 DMA 形式
0x0B5..0x0CCkDmaHbmToVmemkDmaSmemToVmem方向矩阵(HBM/VMEM/SMEM/CMEM/HIB/IMEM)
0x0CD..0x0D0kDmaHbmToVmemWithHibUpdate…VdstWithHibUpdateHBM→具有 HIB 更新的 VMEM
0x0D1..0x0D8kDmaHbmToHostkDmaSmemToHostIova主机DMA(直接+IOVA)
0x0D9/0x0DAkDmaDone / kDmaDoneWaitDMA完成/等待

注意 — 成本模型按方向级别对 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助记词插槽语义
0x0E1kPredicateConstant谓词可重新设置谓词常量 (opcode_info=0x00D0)
0x0E2/0x0E3kVectorMaskConstant / …Packed面罩掩码常数
0x0E5..0x0E8kPredicateNegatekPredicateOr谓词谓词逻辑(共享 GhPerf 行 0x032)
0x0E6kPredicateMove谓词谓词复制 — 移动排除
0x167..0x16AkVectorComparekVectorAddCarryU16面罩掩模生成比较+加进位
0x193..0x199kVectorMaskXorkVectorMaskMove面罩掩码逻辑/包压缩/否定/移动
0x195kVectorMaskAnd面罩掩模AND(合成矩形组合)
0x198kVectorMaskNegate面罩面膜补充品
0x199kVectorMaskMove面罩掩码副本 — 移动排除

四个移动排除操作码 — 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..0x02EkAllocationAddress / kParameterAddress / kIntToPtr地址物化(可重格式化)
0x0DB..0x0E0kScalarConstantU32kVectorConstantF32标量/矢量常量 (U32/PackedBf16/F32)
0x0E4kVectorConstantU6464位向量常量
0x0E9..0x0ECkPredicatePhi / kScalarPhi / kVectorPhi / kVectorMaskPhiSSA phi 节点(成本 0)
0x0ED..0x0F0kTuple / kInlinedCall / kCall / kInlinedCallOperand调用/元组结构
0x0F1..0x0F4kPredicatePseudokVectorMaskPseudo每个寄存器类的伪占位符
0x17CkRelocatableConstant链接时间重定位常量

BarnaCore(SparseCore)块(0x1AC..0x1CC)

33 个最高操作码是 BarnaCore (SparseCore) 指令集 — 嵌入分散/聚集、稀疏归约、远程标量写入和 BarnaCore 本地向量加载/存储/移动。这些是 LLVM-MC 发射器实际编码的操作码(其填充的 InstBits_BarnaCorePxcHwMode 表涵盖此范围),与返回全零的 TensorCore 操作码不同。 SparseCore 标量/矢量操作码枚举(每个引擎的 SCS/TAC/TEC 标量 ALU 和矢量 ALU 名册)是独立的引擎系列枚举,具有自己的深层页面 - 请参阅 SPU/标量插槽§SparseCoreVPU插槽

LloOpcode助记词语义
0x1AC..0x1B3kBarnaCoreScalarWaitDonekBarnaCoreScalarWaitNe标量等待/同步原语
0x1B4..0x1B7kBarnaCoreScalarSyncDoneRead…SyncPublicAccessWrite同步标志读/写
0x1B8..0x1BBkBarnaCoreScalarPopkBarnaCoreDma弹出/FSM问题/围栏(kBarnaCoreScalarFence 0x1BA)/DMA
0x1BC..0x1C8kBarnaCoreRemoteScalarWritekBarnaCorePfLocalScatterGradients远程写入/分散-聚集/稀疏-减少
0x1C9..0x1CCkBarnaCoreVectorLoadkBarnaCoreVectorStoreBarnaCore 矢量加载/存储/移动

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 v6eGhostlitevector_misc 插槽操作;合并VectorSelect; 2 个矢量存储写入端口
TPU7x6acc60406双矩阵分级(MSRA/MSRB);仅浮点数 FP8 matmul 重新映射;双谓词槽;下降 TAC 发动机、产量机械

注意 — 附加和插入,而不是仅附加。 新操作码被“插入”到内存中 LloOpcode 的自然位置(保持系列连续),但“附加”到 LloOpcodeProto 线枚举的末尾(保留线兼容性)。这就是为什么 proto 498/499 映射到低内存操作码 (0x084/0x197) — 经过字节精确验证。移植实际的 LloOpcodeToProto 表 (0x344cb4c),而不是公式。请参阅 LloOpcode↔原型


验证来源 {#verification-provenance}

该表的值↔助记符↔槽绑定的代表性示例直接基于二进制文件(分类器、构建器、转换器)。探测(所有已确认字节精确):

探头二进制事实确认
LloOpcodeName @ 0x1d631280绑定 >= 0x1CDud1;索引 opcode_name @ 0x21ccfef0461密集枚举器
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/0x980x99/0x9a; matmul-mubr 0x9c/0xa0
EmitVectorMatresa3 != 338 防护罩kVectorMatres = 0x152 (338)
CreateVectorLatchLsf @ 0x1d4d7aa0New(141, …)kVectorLatchLsf = 0x8D (141)
LloOpcodeIsPseudoEupInstruction @ 0x1d60c880(op-315)<0x13 & (0x7FDFF >> (op-59))融合 EUP 带 0x13B..0x14D 减去 0x144
CreateVectorEupResult @ 0x1d4d9820断言推送操作码 (op-296) < 0x13EUP 推范围 [0x128,0x13A] → 流行 0x14E
EncodeTensorCoreVectorAlu3F32Tanh (gfc)op=0 @194/w8,sel=19 @183/w5,src @188/w6F32 Tanh 选择器 0x13
EncodingToScalarRegister @ 0x1e871e40绑定 > 0x1F → 错误32深度SREG文件(5位)
TpuSequencerTypeFromProto @ 0x20b36300原型 1..6 → 内部 0..5 开关6 值排序器类型枚举
LloOpcodeToProto @ 0x14420020GOT相关表@ 0x344cb4c正向图是平面查找
ProtoToLloOpcode @ 0x14420040499臂开关;原始 497→460、498→132、499→407; 38 __debugbreak 手臂反向图+38个预留间隙

交叉引用