Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Cross-Gen kernel_info_table / Opcode Matrix

Scope. This is the image-grounded, byte-exact Rosetta that the per-generation firmware kernel pages cross-link: opcode → (kernel name, engine, operand struct, dtype-set), per generation, carved directly from the actual Q7 POOL firmware images embedded in libnrtucode_internal.so. Its spine is the two-dispatch-surface model — the SEQ engine's ASCII-hub jump table on the NX core versus the Q7 POOL core's kernel_info_table linear-scan — and the master opcode→kernel join across all five generations.

The ISA-evolution step-diff narrative and the TONGA v1 deep-dive live on the sibling page Cross-Generation Opcode-Table Diff + TONGA; this page does not re-derive TONGA. Here we stay on the image-grounded KIT matrix.


Provenance & confidence model

Everything below is derived from static analysis of shipped binaries only: the embedded device firmware images inside libnrtucode_internal.so, the shipped arch_isa opcode enums (aws_neuron_isa_tpb_common.h), the shipped instruction_mapping.json, the demangled .xt.prop symbols, and the IDA *_enums.json artifacts. No external source tree was referenced.

Spot-verifier binary. extracted/.../custom_op/c10/lib/libnrtucode_internal.so, sha256 b7c67e898a116454a8e0ce257b1d6523a23ffa237a6ec21021ecb70632fc329b (re-hashed this task — MATCH the image-catalog anchor). Disassembler: the shipped Cadence ncore2gp xtensa-elf-objdump (Binutils 2.34, Xtensa Tools 14.09).

TagMeaning
HIGHdirect disassembly / byte read / hash match
MEDstrong inference (reloc-anchored, .xt.prop-routed, or shared-region trampoline)
LOWplausible, not pinned
OBSERVEDread directly from the bytes / disasm
CARRIEDbrought forward from an upstream image carve (e.g. SUNDA, out of this package)

NOTE. Five KIT cells across four generations were re-carved byte-exact this task to anchor the matrix (see §7 Spot-verification). All five blob hashes and key columns matched their anchors.


0. The verdict up front

  • There are TWO distinct dispatch surfaces, on TWO separate Xtensa cores, bridged by ONE opcode (0xF0). This is the central structural fact the whole matrix hangs on. Surface A is the SEQ engine's ASCII-hub jump table on the NX core (NX_POOL/NX_ACT/NX_DVE/NX_PE/NX_SP); Surface B is the Q7 POOL compute core's kernel_info_table. The 0xF0 ExtendedInst handler is the explicit escape that forwards (0xF0, spec) from Surface A to Surface B. No third dispatch level. [HIGH/OBSERVED — §1, §7]
  • The Q7 POOL kernel_info_table key set is generation-stable and byte-for-key identical across the v3→v5 band. Re-carving and key-diffing the (opcode,spec) column of EXTISA_0 from the shipped binary across three generations gives CAYMAN (910d41c3) ≡ MARIANA (9f2ce049) ≡ MAVERICK (a92c8ba0) — all 17 entries, ADDED=[] / REMOVED=[]. MARIANA_PLUS EXTISA_0_SO is byte-identical to MARIANA (9f2ce049). The POOL compute opcode space does not grow from CAYMAN through MAVERICK; only the funcVAs relocate. [HIGH/OBSERVED — re-carved this task, §7]
  • SUNDA is the floor and the only key-set outlier. SUNDA's Q7 table is a single flat 18-entry table, all spec=0, opcodes 0x41..0xe7, with no 0xF0 rows (no ExtendedInst bridge), no 0x7b dequant, no 0xe4 cptc, no 0xbe/0xf2. SUNDA's Q7 is an external-lib-loading shell — its kernels live in a separate runtime container (libnrtucode_extisa.so, in the neuronx-runtime package, not this checkout). SUNDA's 18 rows are [HIGH/CARRIED] from the SUNDA image carve.
  • Generation opcode-space growth happens on OTHER engines, not POOL's compute table. The TPB OPCODE enum grew 159 → 165 (+6 net) from MARIANA to MAVERICK; DVE gained +7 (RNG/sparsity/MX) and PE gained +4 (PeManageSeed/MX/ConvLutLoad) at CAYMAN→MARIANA. But POOL's NX_POOL SEQ table stayed 177-bound and POOL's Q7 kernel_info_table key set stayed identical across all of v3/v4/v4+/v5. The "MX / dtype expansion" is realized on DVE and PE — not as new POOL KIT rows. [HIGH/OBSERVED]
  • QUANTIZE_MX (0xe3) binds DVE, not POOL. 0xe3 is absent from all four MAVERICK Q7 EXTISA POOL KITs (re-carved: not in the 17-entry EXTISA_0); it is armed only in the MAVERICK DVE PROF CAM. POOL's only MX surface is 0x7b TENSOR_DEQUANTIZE (EXTISA_0 idx16). [HIGH/OBSERVED — re-carved this task]

1. The two-dispatch-surface model — the spine of the matrix

The GPSIMD POOL slice is two Xtensa cores: a front-end SEQ engine on the NX core that fetches the instruction stream, and a back-end Q7 POOL compute core that runs the tensor kernel. They have two completely different dispatch mechanisms, joined by a single escape opcode.

Surface A — SEQ ASCII dispatchSurface B — Q7 kernel_info_table
coreNX (front-end fetch)Q7 (compute back-end)
log prefix'S:''P%i:' (per pool-core index i)
reset vectorj 0x1dc (CAYMAN/SUNDA); per-gen relocatedj 0x200 (CAYMAN); j 0x220 (SUNDA, +0x20)
table locationDRAM 0x80814 (DEBUG) / 0x80218 (PERF)EXTISA ELF section kernel_info_table @ VMA 0x02000380
keyindex = opcode_byte − 0x41 ('A'-base; DVE uses −0x30 '0')packed u32 = (opcode<<24)|(spec<<16); record {0,0,spec@+2,opcode@+3,fv_le@+4}
lookupdirect-indexed jump (addx4)linear scan by packed key
width178 slots (bound movi a3,177)17 entries (EXTISA_0) +1/+2/+9
real handlers~55 real / 123 default (POOL)every entry is real (callx8 funcVA)
handler formC++ Handler::execute() (4 hops: table→tramp→impl→thunk)flat C kernel fn (1 hop: table→funcVA trampoline→worker)
miss policy"S: Bad Opcode" → hard spin"P%i: UNKNOWN OPCODE=0x%x"
packagingflat IRAM/DRAM device segmentEXTISA_n EM_XTENSA ELF (+ flat Q7 IRAM)
reachfetches every opcode in the streamreached via the per-opcode handler and the 0xF0 bridge

The 0xF0 ExtendedInst bridge

[HIGH/OBSERVED — spot-verified §7]

SEQ-side opcode 0xF0 resolves (via the NX core's index 0xF0 − 0x41 = 0xAF, slot at DRAM file offset 0x814 + 0xAF*4 = 0xad0) to the ExtendedInst trampoline 0x3190. This handler is POOL-exclusive — absent on the ACT/DVE/PE/SP SEQ tables. It forwards (0xF0, spec) to the Q7 core, where the kernel_info_table registers 0xF0 five times in EXTISA_0 (spec 0,1,2,4,3) plus once more in EXTISA_3 (spec 7, the cptc extended path). The spec byte sub-selects the kernel. There is no third dispatch level.

Surface A — SEQ ASCII dispatch (C pseudocode)

The NX SEQ engine normalizes the opcode to an 'A'-base index and does a direct-indexed jump into the 178-slot table. The handler is a C++ Handler::execute() virtual, so the "resolved" address is a trampoline that re-dispatches through the engine vtable.

/* Surface A: SEQ ASCII-hub dispatch (the NX core; 'S:' dialect).            */
/* Table base @ DRAM 0x80814 (DEBUG build) / 0x80218 (PERF). 178 slots.      */
/* Reconstructed from the dram.bin carve (sha 7bdf6ed7) + the 0x2e5f..0x2e62 */
/* prologue: addi a2,a2,-65 ; movi a3,177.                                    */

#define SEQ_TABLE_BASE   0x80814u      /* DEBUG */
#define SEQ_TABLE_BOUND  177u          /* movi a3,177 -> 178 entries 0..177  */
#define SEQ_OPCODE_BIAS  0x41u         /* 'A'  (DVE engine uses 0x30 = '0')  */

static seq_handler_t  seq_table[178];  /* DRAM-resident; index = op - 'A'    */

void seq_dispatch(uint8_t opcode, const seq_inst_t *inst, EngineState *eng)
{
    uint32_t idx = (uint32_t)(opcode - SEQ_OPCODE_BIAS);   /* normalize 'A'   */
    if (idx > SEQ_TABLE_BOUND) {                           /* out of table    */
        seq_log(eng, "S: Bad Opcode");                     /* -> hard spin    */
        engine_fault_spin(eng);
        return;
    }
    seq_handler_t h = seq_table[idx];                      /* addx4 + load    */
    /* C++ Handler::execute() — 4 hops: table -> tramp -> impl -> thunk.      */
    h->vtbl->execute(h, inst, eng);                        /* virtual call    */
    /* opcode 0xF0 lands here too: its handler is the ExtendedInst trampoline */
    /* (slot @ file 0xad0 = 0x3190) which forwards (0xF0, spec) to Surface B. */
}

Surface B — Q7 kernel_info_table (C pseudocode)

The Q7 POOL core packs (opcode, spec) into a u32 key and linearly scans the kernel_info_table for the matching record, then does a single callx8 to the funcVA. There is no normalization and no jump table — it is a flat record scan.

/* Surface B: Q7 POOL kernel_info_table dispatch (the 'P%i:' dialect).        */
/* Table @ EXTISA ELF section VMA 0x02000380. 8-byte records, linear scan.    */
/* Record layout (re-carved byte-exact this task):                            */
/*   off+0..1 : 0,0       (pad / reserved)                                     */
/*   off+2    : spec      (the 0xF0 sub-selector; 0 for plain opcodes)         */
/*   off+3    : opcode    (the TPB opcode byte)                                */
/*   off+4..7 : funcVA    (little-endian; the kernel entry point)              */

typedef struct { uint8_t pad0, pad1, spec, opcode; uint32_t funcVA; } kit_entry_t;

/* The packed key the scan compares against: (opcode<<24)|(spec<<16).         */
#define KIT_KEY(op, sp)  (((uint32_t)(op) << 24) | ((uint32_t)(sp) << 16))

void q7_pool_dispatch(uint8_t opcode, uint8_t spec,
                      const kit_entry_t *kit, size_t n_entries,
                      const pool_inst_t *inst, PoolState *p)
{
    uint32_t want = KIT_KEY(opcode, spec);
    for (size_t i = 0; i < n_entries; ++i) {               /* LINEAR SCAN     */
        if (KIT_KEY(kit[i].opcode, kit[i].spec) == want) {
            pool_kernel_fn fn = (pool_kernel_fn)(uintptr_t)kit[i].funcVA;
            fn(inst, p);                                   /* callx8 funcVA   */
            return;
        }
    }
    pool_log(p, "P%i: UNKNOWN OPCODE=0x%x", p->core_idx, opcode);
}

GOTCHA — SUNDA's surfaces differ (the v2 floor). SUNDA Surface A is a raw-compare chain (no −0x41 normalization, no 178-slot table); SUNDA Surface B is a single flat 18-entry table with no 0xF0 bridge. On SUNDA the two cores are coupled by the external-lib loader / direct-opcode path, not the 0xF0 escape. [HIGH/CARRIED]


2. The Q7 POOL kernel_info_table — cross-gen, EXTISA_0 (the MAIN compute table)

The 17-entry EXTISA_0 table is the authoritative POOL compute back-end for v3..v5. The (opcode,spec) key set is identical across CAYMAN / MARIANA / MARIANA_PLUS / MAVERICK (re-carved this task — see §7); only the funcVAs relocate. The funcVAs shown are the CAYMAN ET_EXEC values (.text @ 0x01000000), re-read byte-exact this task.

[idx / opcode / spec / funcVA — HIGH/OBSERVED, re-carved. kernel name HIGH where .xt.prop EXACT, MED where routed. struct/dtype CARRIED from the FW reports.]

idxopspecKERNEL (resolved)ENGINESTRUCT (FW)DTYPE / routefuncVA (CAYMAN)conf
00x7e0pool_iota (iota_impl<t/f>)Q7_POOLPSEUDO/iotaINT (index ramp)0x01000080HIGH(op)/MED(route)
10x7c0pool_cross_lane_reduce_arithQ7_POOLS3D3 (reduce)arith full op set0x010003f8HIGH [.xt.prop EXACT]
20x7d0pool_cross_lane_reduce_bitvecQ7_POOLS3D3 (reduce)bitvec (and/or/xor)0x01000410HIGH [.xt.prop EXACT]
30x450decode_pool(bool) [Pool]Q7_POOLS3D3 (pool)avg/max pool0x01000b90HIGH(route)/MED(op-name)
40x510decode_tensor_tensor (bitvec 'Q')Q7_POOLS3S3D3_TTDTYPE_PAIR bitvec0x0100105cMED
50x410pool_tensor_tensor_arith_opQ7_POOLS3S3D3_TTDTYPE_PAIR arith0x01000f1cHIGH(op)/MED(route)
60xf00ExtendedInst spec0 (EngineNop)Q7_POOL(ext bridge)n/a0x01003370MED
70xf01pool_extended_inst_copyQ7_POOL(ext bridge)copy0x01003380HIGH [.xt.prop EXACT]
80xf02decode_extended_inst_tensor_tensorQ7_POOL(ext bridge)S3S3D3_TT0x01003484HIGH
90xf04ExtendedInst spec4 → Rand bandQ7_POOL(ext bridge)→ decode_pool/Rand0x010037a8MED
100xf03ExtendedInst spec3 → Rand bandQ7_POOL(ext bridge)→ decode_pool/Rand0x01003a60MED
110x520op 0x52 ('R') dispatchQ7_POOL(.data tbl)0x01003b40LOW
120x460pool_copyQ7_POOLS3D3 (copy)bit-accurate copy0x010040c0HIGH(op)/MED(route)
130x470pool_castQ7_POOLS3D3 (cast)in→FP32→out0x01004160HIGH(op)/MED(route)
140xbe0get_sequence_bounds [GetSeqBounds]Q7_POOLS3D3_SEQ_BOUNDSdtype-keyed bounds0x01004204HIGH(op)/MED(route)
150xf20get_sequence_bounds/NonzeroWCountQ7_POOLS3D3_NONZERO_WC<float>/<int>0x0100484cMED
160x7b0decode_tensor_dequantize [TensDeq]Q7_POOLS3D3_TENS_DEQUANTproc_4bit_mx_8 (MX)0x01004dc4HIGH(route)

Per-gen funcVA reloc: CAYMAN (ET_EXEC, .text @ 0x01000000) → MARIANA (+0..+0x44 monotonic reloc) → MARIANA_PLUS (byte-identical SO to MARIANA) → MAVERICK (stripped ET_DYN, .text @ 0x0, fresh rebuild; same key set, re-ordered funcVAs). [HIGH/OBSERVED]

CORRECTION — idx14/15 (0xbe vs 0xf2). The SEQ-side 'S:' log lists "GetSequenceBounds" and "NonzeroWithCount" as distinct handlers. The shipped maverick enum pins GET_SEQUENCE_BOUNDS = 0xbe and NONZERO_WITH_COUNT = 0xf2 (confirmed below). The 0xf2 trampoline routes into a shared sequence-bounds / dequant region, hence the historical "get_sequence_bounds/dequant" label on the 0xf2 row — but the authoritative opcode split is 0xbe = GetSequenceBounds, 0xf2 = NonzeroWithCount. Any source that wrote "0xf2 = GetSequenceBounds loosely conflated them. [HIGH/OBSERVED — enum pins]

The smaller EXTISA images (re-carved byte-exact this task)

  • EXTISA_1 (1 entry @ VMA 0x02000048): 0x7e/0 (iota). [HIGH/OBSERVED]

  • EXTISA_2 (2 entries @ VMA 0x02000070): 0x7c/0, 0x7d/0 (cross-lane reduce). [HIGH/OBSERVED]

  • EXTISA_3 (9 entries @ VMA 0x020008c8, the cptc/MX codec family) [HIGH/OBSERVED — re-carved, funcVAs below]:

    idxopspeckernelfuncVA (CAYMAN)
    00x7e0pool_iota0x01000080
    10x7c0clr_arith0x010003f8
    20x7d0clr_bitvec0x01000410
    30x450decode_pool [Pool]0x01000b90
    40xbe0get_sequence_bounds0x01000dac
    50xf20nonzero / seq-bounds0x010013f4
    60x7b0decode_tensor_dequantize0x01001964
    70xe40cptc dispatcher (CONV_LUT_LOAD; cptc_decode_impl<1..6> DTYPE-selected)0x01002258
    80xf07ExtendedInst spec7 → cptc extended path0x01003b64

    0xe4 = NEURON_ISA_TPB_OPCODE_CONV_LUT_LOAD per the shipped maverick enum (confirmed below); present on both CAYMAN and MAVERICK. The cptc codec family is selected inside the kernel by DTYPE/spec.


3. The SUNDA Q7 POOL table — the 18-entry flat floor (the only key outlier)

Single flat table, all spec=0, no 0xF0. [HIGH/CARRIED] — the SUNDA EXTISA container (libnrtucode_extisa.so, sha 444497066f5e1738) ships in the neuronx-runtime package, not this checkout's customop-lib package, so these rows are byte-reads carried from the SUNDA image carve, not re-verified here.

idxopKERNEL (SUNDA JSON name map)SEQ-equivalent (CAYMAN+ opcode)
00xe7pool_indirect_copy0xe7 IndirectCopy (S4D4_IC)
10x74pool_tensor_scalar_addr0x74 TensorScalarAddr
20x67pool_pool_buffer_load0x67 PoolBufferLoad band
30x68pool_gather (send_gather_request)0x68 TensorGather (S4D4_GT)
40x46pool_copy0x46 Copy
50x47pool_cast0x47 Cast
60xb8dma_memcopy0xb8 DmaMemcopy
70xbbdma_memcopy_indirect0xbb DmaMemcopyIndirect (DMA_INDIRECT1D)
80x7epool_iota (iota_kernel)0x7e Iota
90x41pool_tensor_tensor_arith_op0x41 TensorTensorArith (S3S3D3_TT)
100x7cpool_cross_lane_reduce_arith0x7c CrossLaneReduce arith
110x7dpool_cross_lane_reduce_bitvec0x7d CrossLaneReduce bitvec
120x49pool_memset0x49 MEMSET/RNG
130x7apool_load_pool_argument0x7a LoadPoolArgument
140x79pool_embedding_update0x79 EmbeddingUpdate
150x43pool_tensor_scalar_arith_op0x43 TensorScalarArith
160x44pool_tensor_scalar_arith (op68 alias)0x44 TensorScalarPtrArith (shares funcVA w/0x43)
170x92pool_tensor_scalar_affine_select0x92 TensorScalarAffineSelect

SUNDA-vs-CAYMAN+ diff. SUNDA lacks the entire extended layer present in CAYMAN's EXTISA_00xF0×5 (ExtendedInst bridge), 0x7b (TensorDequantize), 0xe4 (cptc), 0xbe (GetSequenceBounds), 0xf2 (NonzeroWithCount), 0x52, 0x51. SUNDA carries instead the indirection/DMA primitives flat (0xe7/0x68/0xb8/0xbb/0x74/0x67/0x7a/0x49/0x92) that on CAYMAN+ are SEQ-handler-reached, not kernel_info_table rows. [HIGH/CARRIED]


4. The consolidated opcode matrix — the full union

This is the page's spine: rows are the union of (the SEQ 178-table real opcodes) ∪ (the Q7 kernel_info_table opcodes) ∪ (the 0xF0 ExtendedInst specs). Columns:

  • OP — TPB opcode byte (ASCII shown where in 0x41..0x7e).
  • SURF — which dispatch surface(s): A = SEQ ASCII, B = Q7 KIT, A→B = bridged.
  • ENG — the engine that executes it (POOL = Q7_POOL, NX = NX SEQ, DVE, PE, ACT, SP).
  • STRUCT — the operand struct (FW report).
  • DTYPE — the supported dtype family.
  • GEN PRESENCESU CA MA MP MV (SUNDA / CAYMAN / MARIANA / MARIANA_PLUS / MAVERICK); Y present, - absent, ~ present-but-remapped/SEQ-only at that gen, ? not byte-pinned.
  • SRC / conf — the report that established the binding.

Matrix dimensions: 49 opcode rows × 5 generations. Every kernel_info_table cell (Surface B) is byte-grounded HIGH/OBSERVED; SEQ-only and engine-cross cells carry the per-report confidence.

4a. The shared SEQ control/move core (Surface A; all NX engines)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0xa7MOVEANXmove (full reg)U32/I32/FP32YYYYYFW-78 HIGH
(—)AluOp/BRANCH/NOP/NOTIFY/POLL_SEM/Redirect/SET_OM/STRONG_ORDER/Event_Sem/Halt/WRITE/TensorLoad/TensorStore/INS_*/EXT_BREAK (the 18 shared SEQ handlers — control spine, not numbered)ANXCTRLn/aYYYYYFW-07 HIGH

4b. The POOL compute opcodes (Surface B Q7 KIT + their SEQ 'S:' decode)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0x41TensorTensorArith (pool_tensor_tensor_arith_op)A→BPOOLS3S3D3_TTDTYPE_PAIR arithYYYYYFW-49 / KIT5 HIGH
0x51TensorTensorBitvec (decode_tensor_tensor 'Q')A→BPOOLS3S3D3_TTbitvec-YYYYFW-49 / KIT4 MED (SU:~)
0x43TensorScalarArithA→BPOOLS3D3_TSarithYYYYYFW-50 / KIT(SU15) HIGH
0x53TensorScalarBitvecANX/POOLS3D3_TSbitvec?YYYYFW-50 HIGH(op)
0x44TensorScalarPtrArith (dep.)A→BPOOLS3D3_TSarith (ptr-imm)YYYYYFW-50 / KIT(SU16) HIGH
0x54TensorScalarPtrBitvec (dep.)ANXS3D3_TSbitvec (ptr)?YYYYFW-50 HIGH(op)
0x45Pool (avg/max)A→BPOOLS3D3 (pool)poolYYYYYFW-70 / KIT3 HIGH(op)
0x46Copy / pool_copyA→BPOOLS3D3 (copy)bit-accurateYYYYYFW-72 / KIT12 HIGH
0x47Cast / pool_castA→BPOOLS3D3 (cast)in→FP32→outYYYYYFW-72 / KIT13 HIGH
0x49MEMSET/RNG (pool_memset)A→BPOOLS3D3n/aY~~~~IMG-23 HIGH(SU)
0x7aLoadPoolArgumentA→BPOOLPSEUDOn/aYYYYYIMG-23 HIGH
0x67PoolBufferLoadA→BPOOLPSEUDOn/aY~~~~IMG-23 HIGH(SU)
0x7eIota (pool_iota)A→BPOOLPSEUDO/iotaINT index rampYYYYYFW-51 / KIT0 HIGH
0x7cCrossLaneReduce arithA→BPOOLS3D3 (reduce)arithYYYYYFW-51 / KIT1 HIGH [xtprop]
0x7dCrossLaneReduce bitvecA→BPOOLS3D3 (reduce)bitvecYYYYYFW-51 / KIT2 HIGH [xtprop]
0x92TensorScalarAffineSelectA→BPOOLS3D3_TSselectYYYYYIMG-23(SU17) HIGH(SU)
0x74TensorScalarAddrA→BPOOLS3D3_TS (addr)arith (addr op)YYYYYIMG-23(SU1) HIGH(SU)

4c. The indirection / DMA primitives (index-tensor; FW-74)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0x68TensorGather (pool_gather)A→BPOOLS4D4_GTidx U8/16/32YYYYYFW-74 / IMG-23(SU3) HIGH
0x79EmbeddingUpdateA→BPOOLPSEUDOscatter-reduceYYYYYFW-74 / IMG-23(SU14) HIGH
0xe7IndirectCopyA→BPOOLS4D4_ICindexed copyYYYYYFW-74 / IMG-23(SU0) HIGH
0xb8DmaMemcopyA→BPOOL(DMA)n/aYYYYYFW-74 / IMG-23(SU6) HIGH
0xbbDmaMemcopyIndirectA→BPOOLDMA_INDIRECT1Dby-index DMAYYYYYFW-74 / IMG-23(SU7) HIGH

4d. The extended-instruction bridge (0xF0; CAYMAN+ only; POOL-exclusive)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0xf0ExtendedInst (5 specs + cptc spec7)A→BPOOL(escape)per-spec (copy/tt/rand/cptc)-YYYYFW-07/15/18 HIGH

0xF0 sub-selectors (the kernel_info_table 0xF0 rows, §2): spec0 EngineNop · spec1 ExtCopy · spec2 ExtTensorTensor · spec3,4 Rand band · spec7 cptc extended (EXTISA_3).

4e. The extended compute layer (CAYMAN+; absent on SUNDA)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0x7bTensorDequantize (decode_tensor_dequantize)A→BPOOLS3D3_TENS_DEQUANTMX 4-bit; proc_4bit_mx_8-YYYYFW-75/63 / KIT16 HIGH(route)
0xe4ConvLutLoad / cptc disp.A→BPOOLS2_CONVLUTcptc_decode<1-6>-YYYYIMG-21 / KIT3.7 HIGH
0xbeGetSequenceBoundsA→BPOOLS3D3_SEQ_BOUNDSdtype-keyed-YYYYFW-77 / KIT14 HIGH(op)
0xf2NonzeroWithCountA→BPOOLS3D3_NONZERO_WC<float>/<int>-YYYYFW-73 / KIT15 HIGH(op)
0x52op 0x52 ('R') dispatchBPOOL(.data tbl)-YYYYFW-18 / KIT11 LOW

4f. POOL SEQ-only handlers (Surface A; no KIT row — reached as SEQ handler)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0x6bStreamTransposeANX/POOLS4D4_TR32×32 transpose?YYYYFW-59 HIGH(op)
(—)ConvLutLoad/Sort/SB2SB_Collective(0xBF)/ModifyPoolConfig/RandGetState/RandSetStateANX(POOL)various(general compute)-YYYYIMG-06 HIGH(presence)

4g. The DVE compute opcodes (Surface A; engine_idx=3; MX/RNG/sparsity)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0x30ExponentialADVES3D3_TSfp-~YYYFW-42 HIGH (MA add)
0x76Rand (deprecated 'n')ADVE?????FW-48 (not maintained)
0x77RandGetStateADVE/POOLseed state-~YYYFW-48 HIGH (MA add on DVE)
0x78RandSetStateADVE/POOLseed state-~YYYFW-48 HIGH (MA add on DVE)
0xe0SparsityCompressADVES3D3_SCfp8/bf16/fp16--YYYFW-60 HIGH (MA add)
0xe1SparsityCompressTagADVES2D2D2_SCu16 tag (D16/32)--YYYFW-60 HIGH (MA add)
0xe2Rand2ADVEXORWOW uniform--YYYFW-48 HIGH (MA add)
0xe3QuantizeMxADVEMX block quant--YYY (DVE PROF CAM; named handler dropped on MV; POOL ABSENT)FW-60/IMG-09 HIGH

QUIRK — 0xe3 is a DVE opcode, not a POOL KIT row. Re-carving the MAVERICK EXTISA_0 POOL KIT (17 entries) this task confirmed 0xe3 is absent. On MAVERICK the QuantizeMx named handler is even dropped from the DVE roster (60→59); 0xe3 is armed only in the MAVERICK DVE PROF CAM. POOL's only MX surface is 0x7b TensorDequantize (EXTISA_0 idx16). [HIGH/OBSERVED]

4h. The PE matmul opcodes (Surface A; systolic array)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0x01Ldweights (LoadStationary)APES3_LWweight loadYYYYYFW-66/NKI-01 HIGH [hdr]
0x05Matmul (MultiplyMoving)APES3_MMMAC→PSUMYYYYYFW-66/NKI-01 HIGH [hdr]
0x06LdTagsAPES3_LTtag loadYYYYYFW-60/IMG-05 HIGH
0x07MatmulSparseAPES4D3_MM2/3/4 fmap~YYYYFW-60/GEN-05 HIGH
0x08PeManageSeedAPEPE seed state--YYYFW-66/IMG-10 HIGH (MA add)
0x09LdweightsMXAPES3_LW (MX)MX weights--YYY(†)IMG-10 HIGH (MA add)
0x0aMatmulMXAPES3_MM (MX)MX matmul--YYY(†)IMG-10/FW-66 HIGH (MA add)

NOTE. (†) On MAVERICK, MatmulMX/LdWeightMX (0x09/0x0A) fold into Matmul via the MXTensorV2 path (still PE); the opcodes persist but the named handlers merge. PeManageSeed/MX (0x08/0x09/0x0a) first ship at MARIANA (CAYMAN = 0). CONV_LUT_LOAD 0xe4 is CAYMAN-first. [HIGH/OBSERVED]

4i. The ACT opcodes (Surface A; folded into DVE-PROF at MAVERICK)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0x21ActivateAACTS3D3_ACPWL/affineYYYYYFW-76 HIGH
0x22ActivateQuantizeAACTS3D3_AQrequantizeYYYYYFW-76 HIGH
0x23ActivationTableLoadAACTCTRL_NO (pseudo)LUT DMA stageYYYYYFW-76 HIGH
0x24ActivationReadAccumulatorAACTD1_RDaccumulatorYYYYYFW-76 HIGH
0x25Activate2AACT2nd activate?YYYYIMG-19 HIGH(op)

4j. The MAVERICK +6 enum additions (159→165; control/DMA/vector — NOT POOL KIT)

OPKERNEL/HANDLERSURFENGSTRUCTDTYPESUCAMAMPMVSRC / conf
0xb6COMPACT_CONTROL_INSTANX/ctrlcontrol----YIMG-20 HIGH(byte)
0xb9DMA_MEMCPY2ANX/DMADMA----YIMG-20 HIGH(byte)
0xbaDMA_IMMEDIATEANX/DMADMA imm----YIMG-20 HIGH(byte)
(—)ACTIVATE_MULTIPASSAACTmultipass act----YIMG-19 HIGH(name)/MED(byte)
(—)TENSOR_SCALAR_INT_WIDEADVE/POOLwide int TS----YIMG-19 HIGH(name)/MED(byte)
(—)TENSOR_TENSOR_INT_WIDEADVE/POOLwide int TT----YIMG-19 HIGH(name)/MED(byte)

The 0xb6/0xb9/0xba bytes are confirmed from the shipped maverick enum this task: COMPACT_CONTROL_INST = 0xb6, DMA_MEMCPY2 = 0xb9, DMA_IMMEDIATE = 0xba.


5. The per-gen opcode-space evolution (the floor → superset chain)

The GPSIMD opcode space evolves as a strict superset chain. Growth lands on specific engines per generation; POOL's compute table (the Q7 kernel_info_table) is the most stable surface — key-identical v3..v5. The full step-by-step add/remove narrative and the TONGA v1 deep-dive are on the sibling Cross-Generation Opcode-Table Diff + TONGA; here is the concise count ladder.

GENarch/ctPOOL Q7 KITPOOL NX SEQOTHER-ENGINE OPCODE DELTA
SUNDA (v2)arch5 / ct618 flat, all spec=0, NO 0xF0, no dequant/cptc/seqboundsraw-compare chain (no −0x41, no 178-table)THE FLOOR. No RNG, no MX/cptc, no SB2SB, no GetSeqBounds/NonzeroWC, no Sort/ConvLutLoad. dtype 16-base.
CAYMAN (v3)arch12 / ct1317/1/2/9, 0xF0×5+spec7, full extended layer ESTABLISHED178-table, −0x41 norm, 177-bound, 55 real+0xF0 bridge; +0x7b dequant; +0xe4 cptc; +0xbe seqbounds; +0xf2 NonzeroWC; +0xBF SB2SB; +Sort; +ConvLutLoad. RNG = Xorwow(SW) only. dtype 16-base.
MARIANA (v4)arch20 / ct2117/1/2/9 KEY-IDENTICAL (funcVA +0..+0x44 monotonic reloc)177-table UNCHANGED (== CAYMAN)DVE +7: 0x30 Exp, 0x77/0x78 RandGet/SetState, 0xe0/0xe1 Sparsity, 0xe2 Rand2, 0xe3 QuantizeMx. PE +4: 0x08 PeManageSeed, 0x09 LdweightsMX, 0x0a MatmulMX, 0xe4 ConvLutLoad. ENUM 152→159. dtype +FP4_EXP2(0x10)+CPTC1-7(0x19-1F).
MARIANA_PLUS (v4+)arch28 / ct2917/1/2/9 BYTE-IDENTICAL SO to MARIANA (9f2ce049)177-table (recompile)RNG unchanged vs MARIANA. v4+ delta is the DGE fast-path + tensor_reshape_transpose_sb2sb on the NX SEQ side, NOT opcode-space. STABLE.
MAVERICK (v5)arch36 (INFERRED) / ct37 (OBSERVED)17/1/2/9 KEY-IDENTICAL (stripped ET_DYN, fresh rebuild, re-ordered funcVAs, a92c8ba0)DGE/reshape DROPPED firmware-wide (HW-DMA re-arch)POOL Q7 KIT: 0 added / 0 removed. ENUM 159→165 (+6): 0xb6 COMPACT_CONTROL, 0xb9 DMA_MEMCPY2, 0xba DMA_IMMEDIATE, ACTIVATE_MULTIPASS, TENSOR_SCALAR_INT_WIDE, TENSOR_TENSOR_INT_WIDE. ACT-fold: 0x23/0x25 PROF-armed on DVE. dtype +FP8_EXP2(0x11)+INT4(0x12)+SFP8_E8..E5(0x13-0x16).

v4+ = recompile/flag-refresh, NOT a distinct ISA. The v4 and v4+ KIT key-sets are identical (9f2ce049 byte-for-byte); MARIANA_PLUS is a re-flag/re-build, not a new opcode generation. [HIGH/OBSERVED]

Opcode-count ladder (TPB OPCODE enum): SUNDA(v2) floor → CAYMAN(v3) → MARIANA(v4) 152..159 → MARIANA_PLUS(v4+) == MARIANA → MAVERICK(v5) 165. Net additive. The only struct removals in the whole chain are SUNDA's CUSTOM_OP_HEADER/PAYLOAD (CAYMAN replaced them with the kernel_info_table/EXTISA mechanism). [HIGH/CARRIED]

dtype-space evolution [HIGH/OBSERVED — FW-80 ordinal table]:

  • SUNDA == CAYMAN: 16-base codes 0x00..0x0F (INVALID/UINT64/INT8/UINT8/INT16/ UINT16/BFLOAT16/FP16/INT32/UINT32/FP32/FP32R/INT64/FP8_EXP3/FP8_EXP4/FP8_EXP5).
  • MARIANA adds: FP4_EXP2(0x10) + CPTC1..7(0x19..0x1F) (MX element/transport + trellis).
  • MAVERICK adds: FP8_EXP2(0x11) + INT4(0x12) + SFP8_E8..E5(0x13..0x16) (MX element + block-scale). FP32 is the universal convert hub; MX rides UINT32 transport + dequant_fmt.

6. The master Rosetta join — NKI ↔ SEQ opcode ↔ Q7 kernel_info ↔ firmware handler

This is the join that lets a tool walk an NKI op name → SEQ opcode → kernel_info entry → firmware kernel symbol. The NKI column is MED/CARRIED (out-of-corpus — the NKI wheel and emit_<op> MLIR emitters are not in this checkout; only the s3_lw.h crumb spells two NKI names in-corpus). Every device column (opcode / KIT / 'S:' / 'P%i:' handler) is HIGH/OBSERVED.

NKI.isa op (CARRIED)OPSEQ 'S:' handlerQ7 'P%i:' kernelSRC
tensor_tensor0x41Tensor-TensorTensorTensorArithFW-49
(tensor_tensor bitvec)0x51Tensor-TensorTensorTensorBitvecFW-49
tensor_scalar0x43Tensor-Scalartensor_scalar_arithFW-50
(tensor_scalar bitvec)0x53Tensor-ScalarFW-50
(tensor_scalar ptr, dep.)0x44Tensor-Scalar-PTRpool_tensor_scalar_arithFW-50
(pool avg/max)0x45PoolPool : num_chansFW-70
tensor_copy (copy)0x46CopyCopy / pool_copyFW-72
tensor_copy (cast)0x47CastCast / pool_castFW-72
tensor_partition_reduce0x7cCrossLaneReduceTensorReduce / clr_arithFW-51
(cross-lane bitvec)0x7dCrossLaneReduceTensorReduceBitvecFW-51
iota0x7eIotaIota : num_chansFW-51
(TensorDequantize / MX)0x7bTensorDequantizeTensorDequantizeFW-75/63
(GetSequenceBounds)0xbeGetSequenceBoundsGetSequenceBoundsFW-77
(NonzeroWithCount)0xf2NonzeroWithCountNonzeroWithCountFW-73
(ConvLutLoad / cptc)0xe4ConvLutLoadcptc_decode_impl<1..6>IMG-21/FW-15
(Gather)0x68TensorGatherpool_gatherFW-74 [hdr s4d4_ic]
(IndirectCopy)0xe7IndirectCopypool_indirect_copyFW-74
(EmbeddingUpdate)0x79EmbeddingUpdatepool_embedding_updateFW-74
(ExtendedInst)0xf0ExtendedInstExtendedInst<Variant>FW-07/15/18
rand_get_state0x77RandGetStateRandGetStateFW-48/66
rand_set_state0x78RandSetStateRandSetStateFW-48/66
(Rand2)0xe2(DVE)(DVE Rand2)FW-48
(StreamTranspose)0x6bStreamTransposeFW-59
nc_matmul (MultiplyMoving)0x05Matmul(PE)FW-66 [hdr s3_lw]
(LoadStationary / LdWeight)0x01Ldweights(PE)FW-66 [hdr s3_lw]
nc_matmul_mx0x0aMatmulMX(PE)FW-66/IMG-10
(PeManageSeed)0x08PeManageSeed(PE)FW-66/IMG-10
(Exponential)0x30Exponential (DVE)(DVE)FW-42
(move)0xa7MOVEFW-78
(activate)0x21Activate (ACT)(ACT)FW-76

PROVENANCE on the NKI column. Only the s3_lw.h crumb spells two NKI names in-corpus ("LoadStationary in NKI", "Multiply Moving in NKI"). All other NKI op names are CARRIED (MED); the device side of every row (opcode + KIT + 'S:'/'P%i:' handler) is HIGH/OBSERVED.


7. Spot-verification — five cells re-carved byte-exact

All against libnrtucode_internal.so (b7c67e89, re-hashed MATCH this task). [HIGH/OBSERVED]

#CellCarve (file off : size)sha8AnchorResult
1CAYMAN EXTISA_0 (Surface B, v3)0x2ef7e0 : 0xa260910d41c3IMG-06/FW-18PASS — KIT @file 0x7400, 17 entries: idx0 0x7e/0/0x01000080 … idx16 0x7b/0/0x01004dc4, the five 0xF0 rows (spec 0,1,2,4,3).
2NX_POOL DEBUG DRAM SEQ + bridge (Surface A, v3)0x1cdc40 : 0x6f207bdf6ed7FW-07PASS — SEQ tbl @file 0x814: 'A'(0x41)=0x3074, 'E'(0x45)=0x3064, 0xF0 slot @file 0xad0=0x3190 (ExtendedInst trampoline).
3MARIANA EXTISA_0 (Surface B, v4)0x5893c0 : 0xa2609f2ce049IMG-11PASS — 17-entry (opcode,spec) key column re-decoded; key diff vs CAYMAN: ADDED=[] / REMOVED=[] → IDENTICAL.
4MAVERICK EXTISA_0 (Surface B, v5, stripped DYN)0x994de0 : 0x7fb0a92c8ba0IMG-21PASS — KIT @file 0x7038, 17-entry key column; vs CAYMAN: ADDED=[] / REMOVED=[] → IDENTICAL. 0xe3 absent.
5CAYMAN EXTISA_3 cptc 9-entry (Surface B)0x2fbf00 : 0x6974052ac31cIMG-06PASS — KIT @VMA 0x020008c8 (file 0x4748, size 0x48 = 9 entries): 0x7e/0x7c/0x7d/0x45/0xbe/0xf2/0x7b/0xe4(cptc disp 0x01002258)/0xf0-spec7(0x01003b64). EXTISA_1 (1: 0x7e) + EXTISA_2 (2: 0x7c,0x7d) also re-carved + confirmed.

NOTE on the funcVA prologue decode. A linear-sweep ncore2gp objdump of a funcVA target shows FLIX-bundle desync (the documented ncore2gp LX-vs-Vision limitation), so the per-funcVA entry a1,N prologue claim rests on the in-section R_XTENSA_RELATIVE relocs (one-per-entry, 8-byte stride, addend 0) + the .xt.prop EXACT matches — not on a clean linear disassembly. The entry-COUNT and KEY-SET (the primary facts of this matrix) are byte-exact and were re-verified. [HIGH for count/keys; funcVA-prologue HIGH/CARRIED from the reloc-anchored proof.]

Enum cross-check (shipped aws_neuron_isa_tpb_common.h, maverick). Re-read this task: TENSOR_DEQUANTIZE = 0x7b, COMPACT_CONTROL_INST = 0xb6, DMA_MEMCPY2 = 0xb9, DMA_IMMEDIATE = 0xba, GET_SEQUENCE_BOUNDS = 0xbe, QUANTIZE_MX = 0xe3, CONV_LUT_LOAD = 0xe4, EXTENDED_INST = 0xf0, NONZERO_WITH_COUNT = 0xf2. Every byte pin above matches. [HIGH/OBSERVED]


8. The unresolved opcodes (honest remaining-decode targets)

Opcodes present in a SEQ/kernel_info table not yet mapped to a fully-decoded kernel (or whose route is LOW/MED), flagged honestly:

LOW-confidence kernel_info_table rows (route not pinned by .xt.prop EXACT or a clean single-target trampoline):

  • 0x52 ('R') — EXTISA_0 idx11 (funcVA 0x01003b40). Trampoline loads a .data table (0x02002f04); no SUNDA-JSON name match, no .xt.prop EXACT. [LOW]
  • 0xf0 spec0/spec3/spec4 (EXTISA_0 idx6/10/9) — the EngineNop + the two Rand-band routes. Specs 1/2 are HIGH; 0/3/4 route through shared decode_pool/tensor_tensor_ 64bit paths. [MED]
  • 0xf0 spec7 (EXTISA_3 idx8) — the cptc extended path; cptc_decode_impl<1..6> DTYPE-selected, the per-impl DTYPE binding not exhaustively decoded. [MED]

MED-confidence opcode→kernel routes (op number HIGH, internal body MED):

  • 0x45 Pool (decode_pool) — op HIGH, the avg-vs-max + per-channel reduce body partly FLIX-desynced. [MED route]
  • 0xf2 idx15 — the shared sequence-bounds/dequant region trampoline; the exact NonzeroWithCount-vs-GetSequenceBounds split inside the shared region is MED (the opcode split itself, 0xbe/0xf2, is HIGH per the enum). [MED]

SEQ-only handlers without a decoded KIT row (SEQ-only on CAYMAN+, no Q7 KIT entry — reached as SEQ handlers; bodies not separately decoded): ModifyPoolConfig, Sort (decode_sort), SB2SB_Collective (0xBF), the ConvLutLoad SEQ arm. [presence HIGH/OBSERVED; per-kernel decode PENDING]

MAVERICK +6 enum opcodes not byte-pinned in the carves (numeric ordinal only): ACTIVATE_MULTIPASS, TENSOR_SCALAR_INT_WIDE, TENSOR_TENSOR_INT_WIDE — names from the shipped maverick enum, but the byte value + dispatch trampoline are FLIX-desynced / not in a clean carve slot. [name HIGH, byte MED]

Out-of-corpus (cannot be re-verified in this checkout):

  • The SUNDA Q7 EXTISA container (libnrtucode_extisa.so, sha 444497066f5e1738) lives in the neuronx-runtime package — SUNDA's 18 rows (§3) are CARRIED.
  • The NKI Python wheel + the emit_<op> MLIR emitters (the compiler half of §6).

9. Reconciliation of the "MAVERICK 6 new opcodes" premise

A common informal claim is that MAVERICK adds six opcodes 0xb6/0xb9/0xba/0x26/0xf3/0xf4 plus the FIND_INDEX8/MATCH names. Reconciled against the OBSERVED carves + the shipped maverick enum (re-read this task):

  • Genuine MAVERICK +6 enum growth (159→165) is 0xb6 COMPACT_CONTROL_INST, 0xb9 DMA_MEMCPY2, 0xba DMA_IMMEDIATE [HIGH/OBSERVED byte] + ACTIVATE_MULTIPASS, TENSOR_SCALAR_INT_WIDE, TENSOR_TENSOR_INT_WIDE [HIGH name / MED byte]. So 0xb6/0xb9/0xba ARE three of the six (CONFIRMED). 0x26/0xf3/0xf4 are NOT the pinned bytes for the other three — those three are the INT_WIDE / MULTIPASS names, ordinal-not-byte-pinned. 0x26/0xf3/0xf4 are not corroborated by the carves and are not asserted here.
  • FIND_INDEX8 (0x6e), MATCH_VALUE_LOAD (0x6d), MATCH_REPLACE8 (0x6f), MAX8 (0x6c) are PRE-EXISTING MARIANA-gen DVE opcodes. At MAVERICK they are newly PROF-armed on DVE as part of the ACT→DVE fold — they are NOT v5 opcode-space additions. The "+10 PROF arm" (0x23/0x25/0x58/0x61/0x62/0x6c/0x6d/0x6e/0x6f/0x99) re-arms pre-existing opcodes onto DVE; it is a PROF-table change, not opcode growth. [HIGH/OBSERVED]

This is the honest correction the synthesis is obligated to make.


10. Honesty ledger

HIGH / OBSERVED (re-derived byte-exact this task against the shipped binary):

  • internal.so b7c67e89 re-hashed MATCH.
  • CAYMAN EXTISA_0 (910d41c3) 17-entry KIT re-decoded byte-exact (SPOT 1).
  • NX_POOL DEBUG DRAM (7bdf6ed7) SEQ table 'A'/'E'/0xF0 slots (SPOT 2).
  • MARIANA (9f2ce049) + MAVERICK (a92c8ba0) key sets re-decoded; both key-identical to CAYMAN (ADDED=[]/REMOVED=[]) (SPOT 3/4) — cross-gen key stability v3→v4→v5 confirmed from the binaries, not inferred.
  • CAYMAN EXTISA_3 (052ac31c) 9-entry cptc table (incl. 0xe4 + 0xf0/spec7) + EXTISA_1 (1: 0x7e) + EXTISA_2 (2: 0x7c/0x7d) (SPOT 5).
  • 0xe3 absent from MAVERICK EXTISA_0; 0x7b present — POOL MX surface = 0x7b.
  • The opcode byte pins from the shipped maverick enum.
  • The two-dispatch-surface model + the 0xF0 bridge reconciliation.

HIGH / CARRIED (byte-read upstream, not re-verified here): SUNDA's 18-entry flat table (§3, out-of-corpus); MARIANA_PLUS EXTISA_0 byte-identical-to-MARIANA (9f2ce049); the per-opcode struct + dtype bindings.

MED / INFERRED: several KIT funcVA routes (the funcVA prologue claim rests on reloc + .xt.prop, not linear disasm — FLIX-desync); the NKI op-name column (§6, CARRIED out-of-corpus); the MAVERICK +6 names ACTIVATE_MULTIPASS / *_INT_WIDE byte values (name HIGH, byte MED).

LOW / NOT CLAIMED: the 0x52 route; the exhaustive per-opcode SEQ table rows (FLIX-desync); the SUNDA per-kernel operand layouts; which silicon/runtime selects DEBUG vs PERF vs DKL; the informal 0x26/0xf3/0xf4 MAVERICK bytes (§9 — not corroborated, not asserted).


See also