The Opcode Catalog Ledger (140 real opcodes)
This page is the index and completeness check for the entire GPSIMD kernels
cluster. It answers one question definitively: of the GPSIMD NEURON_ISA_TPB
opcode space, how many are real hardware kernels, what is each one called, and which
generation ships it?
The headline, derived byte-exact below:
172 union enum values − 31 PSEUDO (NRT-translated) − 1 INVALID = 140 real HW opcodes, every one named from the shipped
common.henums and struct-decoded through the firmware. This count is the union across the four shipped-generationNEURON_ISA_TPB_OPCODEenums (SUNDA / CAYMAN / MARIANA / MAVERICK), not the per-image active subset.
The page crosses three independent dispatch sources to prove this is the right boundary:
- the four shipped
common.hNEURON_ISA_TPB_OPCODEenums — the authoritative roster (172 union values, the 140 after subtraction); - the per-image
kernel_info_table— the 17-entry POOL compute back-end active in one shipped image (CAYMAN_Q7_POOL_PERF_EXTISA_0); - the SEQ ASCII dispatch hub — the 178-slot front-end fetch table (55 real handlers / 123 default fills).
These three counts (140, 17, 55) differ by construction; §3 explains exactly why and which opcodes appear in which source.
Confidence tags follow the Confidence & Walls Model:
OBSERVED = a byte / string read from the shipped image this session; INFERRED =
reasoned over OBSERVED facts; CARRIED = consolidated from a cited cross-page anchor
at its original confidence. The recovered common.h enums, firmware log strings, and
ELF section bytes are binary-derived facts and are cited as such throughout.
Generation byte-confidence: v2 (SUNDA) / v3 (CAYMAN) / v4 (MARIANA) / v4+
(MARIANA_PLUS) are byte-grounded [HIGH/OBSERVED]; v5 (MAVERICK) is
header-OBSERVED only for several late ops (enum names read; device body FLIX-desynced)
→ those rows are [INFERRED]. The per-gen device-body depth tail is flagged MED
honestly in §4 and §5.
1. The 172 − 31 − 1 = 140 derivation (grounded)
1.1 The roster — four enums, one union
Each shipped generation ships exactly one typedef enum NEURON_ISA_TPB_OPCODE { … }
block in its aws_neuron_isa_tpb_common.h. Re-parsed this session from all four
headers under
extracted/aws-neuronx-gpsimd-customop-lib_0.21.2.0_amd64/opt/aws/neuron/gpsimd/
custom_op/c10/include/neuron_{sunda,cayman,mariana,maverick}_arch_isa/tpb/
aws_neuron_isa_tpb_common.h
with the regex NEURON_ISA_TPB_OPCODE_(\w+)\s*=\s*(0x..) and the trailing // Y /
// n flag capture:
| Gen | NC version | Enum assignment lines | Confidence |
|---|---|---|---|
| SUNDA | v2 | 145 | [HIGH/OBSERVED] |
| CAYMAN | v3 | 150 | [HIGH/OBSERVED] |
| MARIANA | v4 (+ M+ v4+) | 159 | [HIGH/OBSERVED] |
| MAVERICK | v5 | 165 | [HIGH/OBSERVED] |
| UNION | — | 172 distinct values | [HIGH/OBSERVED] |
The chain is a strict superset for the shared band (sunda ⊂ cayman ⊂ mariana ⊂ maverick), plus a small set of SUNDA-exclusive ops the later gens dropped (the BF16
cluster 0x8A–0x8F, the dual-ptr pair 0x87/0x88). Zero opcode value maps to
two different names across gens — re-checked this session; the union is therefore
unambiguous. [HIGH/OBSERVED]
NOTE — counts grounded.
rg -c 'NEURON_ISA_TPB_OPCODE_\w+\s*=\s*0x'returns 145 / 150 / 159 / 165 per header (SUNDA/CAYMAN/MARIANA/MAVERICK); the Python union over the four parsed dicts yields 172 distinct values. M+ (MARIANA_PLUS) reuses the MARIANA enum (thekernel_info_tablekey set is byte-identical, sha9f2ce049), so it is folded into the MARIANA roster.
1.2 The 31 PSEUDO opcodes subtracted (0xC1–0xDF)
The contiguous band 0xC1–0xDF (upper three bits 0b110) is 31 PSEUDO opcodes.
The enum names them all NEURON_ISA_TPB_OPCODE_PSEUDO_*, and the maverick header
carries the governing FIXME comment directly on the first pseudo entry:
"currently NRT relies on the fact that all pseudo instructions have upper three bits of the opcode equal to
0b110. Pseudo instructions are generated by compiler and translated into non-pseudo HW instructions by NRT."
These are compiler-emitted scheduling/marshalling tokens that NRT lowers into the
real HW ops before the stream reaches the device. The GPSIMD device firmware never
decodes them; they have no dispatch surface (no SEQ slot, no kernel_info_table
row). All 31 (verified this session: every 0xC1–0xDF entry is named PSEUDO_*,
none escapes the band):
| Op | Pseudo name | Op | Pseudo name | Op | Pseudo name |
|---|---|---|---|---|---|
0xC1 | DMATRIGGER | 0xCB | SEND_RECV | 0xD5 | SYNC_BARRIER |
0xC2 | DMAREARM | 0xCC | BRANCH_LABEL | 0xD6 | RANGE_CHECK |
0xC3 | DMABARRIER | 0xCD | TENSOR_STORE | 0xD7 | JPEG_DECODE |
0xC4 | DMAMEMCPY_FULL_IND | 0xCE | TENSOR_LOAD | 0xD8 | CORE_BARRIER |
0xC5 | SEMAPHORE_SET | 0xCF | DMASWAP_QUEUE_SET | 0xD9 | TRIGGER_COLLECTIVE2 |
0xC6 | LOAD_ACT_FUNC_SET | 0xD0 | SET_RNG_SEED | 0xDA | EXTENSION |
0xC7 | TRIGGER_ALL_REDUCE | 0xD1 | FUNCTION_BEGIN | 0xDB | CUR_PROCESSING_RANK_ID |
0xC8 | TRIGGER_COLLECTIVE | 0xD2 | FUNCTION_RETURN | 0xDC | GID_LOAD |
0xC9 | READ_VAR_ADDR | 0xD3 | FUNCTION_CALL | 0xDD | BRANCH_PREFETCH_HINT |
0xCA | EMBEDDING_UPDATE | 0xD4 | DMA_DIRECT2D | 0xDE | TENSOR_COMPLETION |
0xDF | INST |
[HIGH/OBSERVED — band re-parsed; FIXME comment read from maverick header.]
GOTCHA — pseudo vs. real namesakes. Several pseudo names collide with real-op names (
0xCA PSEUDO_EMBEDDING_UPDATEvs. real0x79 EMBEDDING_UPDATE;0xCD/0xCE PSEUDO_TENSOR_STORE/LOADvs. real0xAB/0xAA;0xDD PSEUDO_BRANCH_PREFETCH_HINTvs. real0xB5). The pseudo is the compiler-side token; the real op is the device-decoded instruction. They are distinct opcode bytes and distinct enum entries. Do not conflate them.
1.3 The 1 INVALID subtracted (0xFF)
NEURON_ISA_TPB_OPCODE_INVALID = 0xFF is a sentinel, not an instruction (it is the
"no opcode" / error marker). There is no 0x00 opcode in any enum (the band starts at
0x01 LDWEIGHTS). One value subtracted. [HIGH/OBSERVED]
1.4 The metric
172 union distinct opcode VALUES across the 4 shipped common.h enums
− 31 PSEUDO 0xC1–0xDF (compiler-generated, NRT-lowered, not device-decoded)
− 1 INVALID 0xFF sentinel (not an instruction)
───────
140 REAL HW opcodes — the GPSIMD kernel-lane decode space
The metric is: distinct opcode VALUES in the union of the four shipped-generation
NEURON_ISA_TPB_OPCODE enums, minus the NRT-pseudo band, minus the INVALID
sentinel. This is the denominator every per-kernel page in this cluster is measured
against. [HIGH/OBSERVED — re-derived byte-exact this session.]
2. The master opcode → kernel table (140 real opcodes)
One row per real HW opcode. Columns:
- Op — the opcode byte (hex).
- Kernel name — from the enum identifier, cross-checked against the
kernel_info_tableresolved name and the SEQ'S:'/ POOL'P%i:'log string. - Eng — executing engine: POOL (Q7 compute core) · NX (SEQ control core) · PE (systolic array) · ACT (activation) · DVE (vector engine) · NX/DMA (descriptor-backed).
- Struct — the operand struct family (from the per-kernel FW decode;
—where the body is not separately decoded). - Dtype — supported dtype set / route.
- Presence — per-gen
[SUNDA·CAYMAN·MARIANA·M+·MAVERICK]:Y=maintained (// Y),n=dormant (// n),.=present-unflagged,-=absent. M+ mirrors MARIANA's enum (byte-identical KIT). - Decode — the cluster page (or status) that decodes this opcode's body.
Rows marked †MED have the body in the per-gen device-depth tail (FLIX-desync
interior, out-of-corpus container, or header-OBSERVED-only on MAVERICK). They are
named + dispatch-placed with HIGH confidence; only the operand-layout body is MED.
2.1 PE — systolic array (0x01–0x0A)
| Op | Kernel name | Eng | Struct | Dtype | Presence | Decode |
|---|---|---|---|---|---|---|
0x01 | LDWEIGHTS | PE | S3_LW | weight load | YYYYY | pe-matmul |
0x02 | MATMUL | PE | S3_MM | MAC→PSUM | YYYYY | pe-matmul |
0x03 | PE_REG_WRITE | PE | — | reg write | YYYYY | pe-matmul |
0x04 | WEIGHT_MASK | PE | — | — | nnnnn | NONE (dormant) |
0x05 | WEIGHT_SHIFT | PE | — | — | nnnnn | NONE (dormant) |
0x06 | LDTAGS | PE | S3_LT | tag load | -YYYY | sparsity-compress-tag |
0x07 | MATMUL_SPARSE | PE | S4D3_MM | 2/3/4 fmap | -YYYY | pe-matmul |
0x08 | PE_MANAGE_SEED | PE | — | PE seed | --YYY | pe-matmul |
0x09 | LDWEIGHTS_MX | PE | S3_LW (MX) | MX weights | --YYY | pe-matmul |
0x0A | MATMUL_MX | PE | S3_MM (MX) | MX matmul | --YYY | pe-matmul |
CORRECTION —
0x05isWEIGHT_SHIFT, not "Matmul". Thekernel_info_tablecross-gen matrix source notes once labelled0x05as "Matmul"; the shipped header is authoritative:0x02 = MATMUL,0x05 = WEIGHT_SHIFT(dormantnnnnn). Recorded here asWEIGHT_SHIFT.[HIGH/OBSERVED]
2.2 ACT — activation (0x21–0x26)
| Op | Kernel name | Eng | Struct | Dtype | Presence | Decode |
|---|---|---|---|---|---|---|
0x21 | ACTIVATE | ACT | S3D3_AC | PWL/affine | YYYYY | activate-pwl |
0x22 | ACTIVATE_QUANTIZE | ACT | S3D3_AQ | requantize | YYYYY | activate-pwl |
0x23 | ACTIVATION_TABLE_LOAD | ACT | CTRL_NO | LUT DMA | YYYYY | activate-pwl |
0x24 | ACTIVATION_READ_ACCUMULATOR | ACT | D1_RD | accumulator | YYYYY | activate-pwl |
0x25 | ACTIVATE2 | ACT | — | 2nd activate | --YYY | NONE — maintained gap †MED |
0x26 | ACTIVATE_MULTIPASS | ACT | — | multipass | ----Y | NONE — MAVERICK + †MED |
2.3 DVE — vector engine (Exponential, RNG, sparsity, MX)
| Op | Kernel name | Eng | Struct | Dtype | Presence | Decode |
|---|---|---|---|---|---|---|
0x30 | EXPONENTIAL | DVE | S3D3_TS | fp | ..... | exponential |
0x76 | RAND | DVE | — | XORWOW | nnnnn | rng-lfsr-dispatch (dormant; covered) |
0x77 | RAND_GET_STATE | DVE | — | seed state | YYYYY | NONE — maintained gap (SEQ-inline; body PENDING) |
0x78 | RAND_SET_STATE | DVE | — | seed state | YYYYY | NONE — maintained gap (SEQ-inline; body PENDING) |
0xE0 | SPARSITY_COMPRESS | DVE | S3D3_SC | fp8/bf16/fp16 | --YYY | sparsity-compress-tag |
0xE1 | SPARSITY_COMPRESS_TAG | DVE | S2D2D2_SC | u16 tag | --YYY | sparsity-compress-tag |
0xE2 | RAND2 | DVE | — | XORWOW uniform | --YYY | rand2 |
0xE3 | QUANTIZE_MX | DVE | — | MX block quant | --YYY | mx-dequant |
NOTE —
0x30 EXPONENTIALpresence. The header carries it present-but-unflagged (.) in all four generations ([HIGH/OBSERVED]). Its DVE compute body is a MARIANA realization (per the cross-gen matrix); the.....reflects the header roster, the DVE engine attribution reflects the runtime.
2.4 POOL — Q7 compute core (the bulk of the kernel lane)
| Op | Kernel name | Eng | Struct | Dtype | Presence | Decode |
|---|---|---|---|---|---|---|
0x41 | TENSOR_TENSOR_ARITH_OP | POOL | S3S3D3_TT | dtype-pair arith | YYYYY | tensor-tensor |
0x42 | TENSOR_REDUCE_ARITH_OP | POOL | S3D3 reduce | arith | YYYYY | tensor-reduce |
0x43 | TENSOR_SCALAR_ARITH_OP | POOL | S3D3_TS | arith | YYYYY | tensor-scalar |
0x44 | TENSOR_SCALAR_PTR_ARITH_OP | POOL | S3D3_TS | arith (ptr) | nnnnn | tensor-scalar (dormant; covered) |
0x45 | POOL | POOL | S3D3 pool | avg/max | YYYYY | avg-max-pool |
0x46 | COPY | POOL | S3D3 copy | bit-accurate | YYYYY | cast-copy |
0x47 | CAST | POOL | S3D3 cast | in→FP32→out | YYYYY | cast-copy |
0x48 | RECIPROCAL | POOL | — | fp | YYYYY | NONE — maintained gap |
0x49 | MEMSET | POOL | S3D3 | — | YYYYY | NONE — maintained gap |
0x4A | REG_LOAD | POOL | — | — | nnnnn | NONE (dormant) |
0x4B | REG_STORE | POOL | — | — | nnnnn | NONE (dormant) |
0x4C | REG_SHUFFLE | POOL | — | — | nnnnn | NONE (dormant) |
0x4D | RNG | POOL | — | XORWOW | YYYYY | rng-lfsr-dispatch |
0x4E | TENSOR_CUMULATIVE_ARITH_OP | POOL | S4D4_TR | arith | YYYYY | tensorcumulative |
0x4F | TENSOR_SCALAR_PTR_MULTI_ARITH | POOL | S3D3_TS | arith | nnnnn | ts-ptrmulti (dormant; covered) |
0x51 | TENSOR_TENSOR_BITVEC_OP | POOL | S3S3D3_TT | bitvec | YYYYY | tensor-tensor |
0x52 | TENSOR_REDUCE_BITVEC_OP | POOL | S3D3 reduce | bitvec | YYYYY | tensor-reduce |
0x53 | TENSOR_SCALAR_BITVEC_OP | POOL | S3D3_TS | bitvec | YYYYY | tensor-scalar |
0x54 | TENSOR_SCALAR_PTR_BITVEC_OP | POOL | S3D3_TS | bitvec (ptr) | nnnnn | tensor-scalar (dormant; covered) |
0x58 | MAX_POOL_SELECT | POOL | — | pool-select | YYYYY | avg-max-pool |
0x5E | TENSOR_CUMULATIVE_BITVEC_OP | POOL | S4D4_TR | bitvec | YYYYY | tensorcumulative |
0x5F | TENSOR_SCALAR_PTR_MULTI_BITVEC | POOL | S3D3_TS | bitvec | nnnnn | ts-ptrmulti (dormant; covered) |
0x67 | POOL_BUFFER_LOAD | POOL | PSEUDO | — | YYYYY | NONE — maintained gap |
0x68 | GATHER | POOL | S4D4_GT | idx u8/16/32 | YYYYY | indirection-gather |
0x69 | LOAD_MASK_SELECT | POOL | — | — | YYYYY | NONE — maintained gap |
0x6A | STREAM_SHUFFLE | POOL | — | — | YYYYY | NONE — maintained gap |
0x6B | STREAM_TRANSPOSE | POOL | S4D4_TR | 32×32 transpose | YYYYY | stream-transpose |
0x6C | MAX8 | DVE | S4D2_BN | search | YYYYY | search-cluster (planned) |
0x6D | MATCH_VALUE_LOAD | DVE | S4D2_BN | search | YYYYY | search-cluster (planned) |
0x6E | FIND_INDEX8 | DVE | S4D2_BN | search | YYYYY | search-cluster |
0x6F | MATCH_REPLACE8 | DVE | S4D2_BN | search | YYYYY | search-cluster (planned) |
0x70 | TENSOR_SCALAR_IMM_LD_ARITH | POOL | S3D3_TS | arith (imm) | nnnnn | ts-immld (dormant; covered) |
0x71 | TENSOR_SCALAR_IMM_LD_BITVEC | POOL | S3D3_TS | bitvec (imm) | nnnnn | ts-immld (dormant; covered) |
0x72 | COPY_PREDICATED | POOL | — | predicated copy | YYYYY | NONE — maintained gap |
0x73 | ROI_ALIGN | POOL | — | — | nnnnn | NONE (dormant) |
0x74 | TENSOR_SCALAR_ADDR | POOL | S3D3_TS addr | arith (addr) | YYYYY | NONE — maintained gap |
0x79 | EMBEDDING_UPDATE | POOL | PSEUDO | scatter-reduce | YYYYY | indirection-gather |
0x7A | LOAD_POOL_ARGUMENT | POOL | PSEUDO | — | YYYYY | NONE — maintained gap |
0x7B | TENSOR_DEQUANTIZE | POOL | S3D3_TENS_DEQUANT | MX 4-bit | YYYYY | tensor-dequantize |
0x7C | CROSS_LANE_REDUCE_ARITH | POOL | S3D3 reduce | arith | YYYYY | cross-lane-reduce |
0x7D | CROSS_LANE_REDUCE_BITVEC | POOL | S3D3 reduce | bitvec | YYYYY | cross-lane-reduce |
0x7E | IOTA | POOL | PSEUDO/iota | INT index ramp | YYYYY | iota |
0x7F | DROPOUT | POOL/DVE | — | mask | YYYYY | dropout |
0x81 | JPEG_DECODE | POOL | — | — | -nnnn | NONE (dormant) |
0x82 | TRANSPOSE_BATCH_NORM_STATS2 | DVE | — | bn stats (T) | YYYYY | batchnorm-forward |
0x83 | TRANSPOSE_TENSOR_REDUCE_ARITH_OP | POOL | S3D3 reduce | arith | YYYYY | tensor-reduce |
0x84 | TRANSPOSE_TENSOR_REDUCE_BITVEC_OP | POOL | S3D3 reduce | bitvec | YYYYY | tensor-reduce |
0x85 | CUSTOM_OP_HEADER | POOL | — | marshalling | YYYYY | NONE — maintained gap |
0x86 | CUSTOM_OP_PAYLOAD | POOL | — | marshalling | YYYYY | NONE — maintained gap |
0x87 | TENSOR_SCALAR_PTR_MULTI_DUAL_ARITH | POOL | S3D3_TS | arith | n---- | sunda-dual-tensorscalarptr (SUNDA-only, dormant) †MED |
0x88 | TENSOR_SCALAR_PTR_MULTI_DUAL_BITVEC | POOL | S3D3_TS | bitvec | n---- | sunda-dual-tensorscalarptr (SUNDA-only, dormant) †MED |
0x8A | TENSOR_TENSOR_ADD_BF16 | POOL | — | bf16 | Y---- | NONE — SUNDA-only †MED |
0x8B | TENSOR_TENSOR_MULT_BF16 | POOL | — | bf16 | Y---- | NONE — SUNDA-only †MED |
0x8C | TENSOR_REDUCE_ADD_BF16 | POOL | — | bf16 | Y---- | NONE — SUNDA-only †MED |
0x8D | TENSOR_REDUCE_MAX_BF16 | POOL | — | bf16 | Y---- | NONE — SUNDA-only †MED |
0x8E | BATCH_NORM_PARAM_LOAD2 | DVE | — | bn param | YYYYY | batchnorm-paramload |
0x8F | TENSOR_TENSOR_SUB_BF16 | POOL | — | bf16 | Y---- | NONE — SUNDA-only †MED |
0x92 | TENSOR_SCALAR_AFFINE_SELECT | POOL | S3D3_TS | select | YYYYY | affineselect (planned) |
0x93 | TRANSPOSE_TENSOR_SCALAR_ARITH_OP | POOL | S3D3_TS | arith | YYYYY | NONE — maintained gap |
0x94 | BATCH_NORM_GRAD_ACCUMULATE2 | DVE | — | bn grad | YYYYY | batchnorm-gradaccum |
0x95 | MODIFY_POOL_CONFIG | POOL | — | config | YYYYY | NONE — maintained gap (SEQ-named; body PENDING) |
0x96 | SORT | POOL | — | sort | YYYYY | sort |
0x98 | TENSOR_SCALAR_SELECT | POOL | S3D3_TS | select | YYYYY | ts-select |
0x99 | CAST_PREDICATED | POOL | — | predicated cast | YYYYY | castpredicated |
0x9A | TENSOR_SCALAR_CACHE_REDUCE | POOL | — | cache-reduce | YYYYY | ts-cache-reduce |
0x9B | DVE_READ_ACCUMULATOR | POOL/DVE | — | accumulator | YYYYY | dve-read-state (planned) |
0x9C | TENSOR_REDUCE_RANGE_CHECK | POOL | — | — | nnnnn | NONE (dormant) |
0x9D | SCALAR_TENSOR_TENSOR_ARITH | POOL | — | arith | YYYYY | scalar-tensor-tensor |
0x9E | SCALAR_TENSOR_TENSOR_BITVEC | POOL | — | bitvec | YYYYY | scalar-tensor-tensor |
0xE4 | CONV_LUT_LOAD | POOL | S2_CONVLUT | cptc codec | -YYYY | convlutload / cptc-codec |
0xE5 | TENSOR_TENSOR_SCAN_ARITH | POOL | — | scan | YYYYY | tensor-tensor-scan |
0xE6 | TENSOR_SCALAR_CACHE_CUMULATIVE | POOL | — | cumulative | YYYYY | ts-cache-cumulative |
0xE7 | INDIRECT_COPY | POOL | S4D4_IC | indexed copy | YYYYY | indirection-gather |
0xE8 | COPY_PREDICATED_SCALAR | POOL | S3D3_CP_PRED_SCALAR | predicated copy | YYYYY | copypredicatedscalar (planned) |
0xE9 | DVE_READ_INDICES | POOL/DVE | — | indices | -YYYY | dve-read-state (planned) |
0xEA | SELECT_REDUCE | POOL | — | select-reduce | YYYYY | copypredicatedreduce |
0xF0 | EXTENDED_INST | POOL | (escape) | per-spec | YYYYY | pool-ext-0xf0 |
0xF1 | DMA_GATHER_TRANSPOSE | POOL | — | gather-transpose | -YYYY | NONE — maintained gap (SEQ FLIX-inline; body PENDING) †MED |
0xF2 | NONZERO_WITH_COUNT | POOL | S3D3_NONZERO_WC | float/int | -YYYY | nonzero-with-count |
0xF3 | TENSOR_TENSOR_INT_WIDE | DVE/POOL | — | wide int | ----Y | NONE — MAVERICK +; not byte-pinned †MED |
0xF4 | TENSOR_SCALAR_INT_WIDE | DVE/POOL | — | wide int | ----Y | NONE — MAVERICK +; not byte-pinned †MED |
2.5 DVE — batchnorm family (0x60–0x66)
| Op | Kernel name | Eng | Struct | Dtype | Presence | Decode |
|---|---|---|---|---|---|---|
0x60 | BATCH_NORM_STATS | DVE | — | bn stats | nnnnn | batchnorm-forward (dormant; covered) |
0x61 | BATCH_NORM_STATS2 | DVE | — | bn stats | YYYYY | batchnorm-forward |
0x62 | BATCH_NORM_AGGREGATE | DVE | — | bn aggregate | YYYYY | batchnorm-forward |
0x63 | BATCH_NORM_GRAD_ACCUMULATE | DVE | — | bn grad | nnnnn | batchnorm-gradaccum (dormant; covered) |
0x64 | BATCH_NORM_PARAM_LOAD | DVE | — | bn param | nnnnn | batchnorm-paramload (dormant; covered) |
0x65 | BATCH_NORM_BACK_PROP | DVE | — | bn backprop | YYYYY | batchnorm-backprop |
0x66 | LOAD_PARAMETER_RAM | DVE | — | 256-recip RAM | YYYYY | batchnorm-forward |
(The transpose/2 batchnorm variants 0x82, 0x8E, 0x94 are listed in their numeric
positions in §2.4.)
2.6 NX — SEQ control core + DMA (0x9F–0xBF)
| Op | Kernel name | Eng | Struct | Dtype | Presence | Decode |
|---|---|---|---|---|---|---|
0x9F | ENGINE_NOP | NX | CTRL | — | YYYYY | SEQ control spine (dispatch-hub named) |
0xA0 | EVENT_SEMAPHORE | NX | CTRL | — | YYYYY | SEQ control spine |
0xA1 | HALT | NX | CTRL | — | YYYYY | SEQ control spine |
0xA2 | DRAIN | NX | CTRL | — | YYYYY | SEQ control spine |
0xA3 | INSTRUCTION_FLUSH | NX | CTRL | — | YYYYY | SEQ control spine (INS_FL) |
0xA4 | NOP | NX | CTRL | — | YYYYY | SEQ control spine |
0xA5 | WRITE | NX | CTRL | — | YYYYY | SEQ control spine |
0xA6 | NOTIFY | NX | CTRL | — | YYYYY | SEQ control spine |
0xA7 | MOVE | NX | move (full reg) | u32/i32/fp32 | YYYYY | move-dtype |
0xA8 | ALU_OP | NX | — | scalar ALU | YYYYY | alu-op-matrix |
0xA9 | COMPARE_BRANCH | NX | — | branch | YYYYY | branch-prefetch |
0xAA | TENSOR_LOAD | NX | — | load | YYYYY | tensorload |
0xAB | TENSOR_STORE | NX | — | store | YYYYY | tensorstore |
0xB0 | EVENT_SEMAPHORE_RANGE_CLEAR | NX | CTRL | — | YYYYY | SEQ control spine |
0xB1 | SET_ORDERING_MODE | NX | CTRL | — | YYYYY | SEQ control spine (SET_OM) |
0xB2 | MOVE_SHAPE | NX | CTRL | — | YYYYY | SEQ control spine (MoveShape) |
0xB3 | POLL_SEM | NX | CTRL | — | YYYYY | SEQ control spine |
0xB4 | TEST_EVENT_SEM | NX | CTRL | — | --YYY | NONE — maintained gap (MARIANA +; no SEQ slot) |
0xB5 | BRANCH_PREFETCH_HINT | NX | CTRL | — | YYYYY | SEQ control spine |
0xB6 | COMPACT_CONTROL_INST | NX | — | control | ----Y | NONE — MAVERICK + †MED |
0xB8 | DMAMEMCPY | NX/DMA | (DMA) | — | YYYYY | NONE — DGE-backed; per-opcode pending |
0xB9 | DMA_MEMCPY2 | NX/DMA | (DMA) | — | ----Y | NONE — MAVERICK +; DGE-backed †MED |
0xBA | DMA_IMMEDIATE | NX/DMA | (DMA) | imm | ----Y | NONE — MAVERICK +; DGE-backed †MED |
0xBB | DMA_INDIRECT | NX/DMA | DMA_INDIRECT1D | by-index | YYYYY | indirection-gather |
0xBC | RANGE_SELECT | NX/DMA | — | range | -YYYY | rangeselect |
0xBD | DMA_TRANSPOSE | NX/DMA | — | transpose | -YYYY | NONE — SEQ FLIX-inline; body PENDING †MED |
0xBE | GET_SEQUENCE_BOUNDS | POOL | S3D3_SEQ_BOUNDS | dtype-keyed | -YYYY | get-sequence-bounds |
0xBF | SB2SB_COLLECTIVE | POOL | — | collective | -YYYY | sb2sb-remote-copy |
NOTE —
0x81 JPEG_DECODEis real-but-dormant (presence-nnnn— absent on SUNDA, dormant on CAYMAN+), listed in its numeric position in §2.4. The pseudo0xD7 PSEUDO_JPEG_DECODEis a different opcode (§1.2).[HIGH/OBSERVED]
Row count: 140 — PE 10 · ACT 6 · DVE-vector 8 · POOL band 56 · batchnorm 10
(0x60–0x66 + 0x82/0x8E/0x94) · NX 49 · 0x81. Every real HW opcode appears
exactly once, verified against the §1.4 derivation.
3. The three-source crossing (why 140 ≠ 17 ≠ 55)
The three dispatch sources are structurally distinct and were never meant to have equal cardinality. The ledger's job is to show the inclusion relations precisely.
| Source | Where | Count | What it enumerates |
|---|---|---|---|
common.h enum union | 4 shipped headers | 140 real (172 − 31 − 1) | the complete roster — every opcode the ISA defines, across all gens, all engines |
kernel_info_table (EXTISA_0) | @VMA 0x02000380, one image | 17 | the per-image active POOL compute subset — only the kernels baked into CAYMAN_Q7_POOL_PERF_EXTISA_0 |
| SEQ ASCII dispatch | @DRAM 0x80814 | 178 slots → 55 real | the front-end fetch surface — the NX core's index = opcode − 0x41 jump table; 55 real handlers, 123 fall to the 0x3198 "Bad Opcode" default |
The counts differ for three reasons:
-
The 140 is the cross-gen union; the 17 is one image. The
kernel_info_tableholds only the POOL compute back-end for a single shipped image. Its 17 keys are{0,0,spec,opcode}8-byte records read LE as(opcode<<24)|(spec<<16); five of them are the same opcode0xF0with different spec bytes (the extended-instruction bridge), so the 17 rows cover only ~13 distinct opcodes. Every other real opcode reaches its kernel by a non-kernel_info_tablepath (direct SEQ handler, DGE, ACT/PE/DVE engine dispatch). Thekernel_info_tablekey set is byte-identical CAYMAN→MAVERICK (sha910d41c3==9f2ce049==a92c8ba0) — POOL's compute table does not grow across generations; the opcode-space growth lands on PE/DVE/ACT instead. -
The 55 SEQ handlers are the fetch surface, not the compute surface. The 178-slot table is what the NX core fetches and routes; 55 slots resolve to real handlers (the SEQ control spine + the POOL/ACT/PE/DVE entry trampolines), the other 123 are
0x3198default fills. The POOL compute opcodes appear here as their SEQ entry'S:'handler (Tensor-Tensor,Pool,Copy, …); their bodies then run on the Q7 core, reached either directly or via the0xF0bridge (the single opcode that forwards(0xF0, spec)from SEQ surface A tokernel_info_tablesurface B). -
The 140 includes engines and gens the other two sources don't. The roster spans PE (
0x01–0x0A), ACT (0x21–0x26), DVE (RNG/sparsity/MX), and the MAVERICK-only and SUNDA-only ops — none of which are POOLkernel_info_tablerows, and several of which (the MAVERICK INT_WIDE0xF3/0xF4, the SUNDA BF160x8A–0x8F) are not in any clean carve slot at all.
The reconciliation, stated as inclusions: the 17
kernel_info_tableopcodes ⊂ the POOL subset of the 55 SEQ-real opcodes ⊂ the 140 roster. Going the other way, the 140 roster − (SEQ-named +kernel_info_table-covered + FW-decoded) = the remaining kernel-lane gap (theNONErows above). See pool-dispatch for the SEQ↔Q7 hand-off and kernel-info-table for the 17-entry byte dump.
4. Per-generation presence
The presence column reads [SUNDA·CAYMAN·MARIANA·M+·MAVERICK]. The byte-grounded story:
-
SUNDA (v2) is the floor. 145 enum entries. It is the only key-set outlier: it has the BF16 cluster
0x8A–0x8F(Y----) and the dual-ptr pair0x87/0x88(n----) that no later gen ships, and it lacks the entire extended layer (no0xF0bridge, no0x7Bdequant, no0xE4cptc, no0xBE/0xF2). SUNDA's POOL kernels live in an out-of-corpus EXTISA container (neuronx-runtimepackage), so its 18-entry flat table is[HIGH/CARRIED], not re-verified here. MED tail flag: the SUNDA BF16 operand layouts are out-of-corpus. -
CAYMAN (v3) establishes the extended layer. 150 entries:
+0x06/0x07(LdTags, MatmulSparse),+0xBC–0xBF/0xE4/0xE9/0xF1/0xF2(the-Y…rows), and the0xF0bridge. Fully byte-grounded[HIGH/OBSERVED]. -
MARIANA (v4) adds DVE + PE. 159 entries:
+0x08/0x09/0x0A(PE seed/MX),+0x25(Activate2),+0xE0–0xE3(sparsity/Rand2/QuantizeMx),+0xB4(TestEventSem). The--YYYrows.[HIGH/OBSERVED] -
MARIANA_PLUS (v4+) reuses the MARIANA enum. No opcode-space delta; the M+ column mirrors MARIANA. The v4+ change is the DGE fast-path, not the opcode roster (KIT sha
9f2ce049, byte-identical to MARIANA).[HIGH/OBSERVED] -
MAVERICK (v5) +6, mostly header-OBSERVED. 165 entries. Three byte-pinned
[HIGH/OBSERVED]:0xB6 COMPACT_CONTROL_INST,0xB9 DMA_MEMCPY2,0xBA DMA_IMMEDIATE. Three name-pinned, byte-MED[INFERRED]:0x26 ACTIVATE_MULTIPASS,0xF3 TENSOR_TENSOR_INT_WIDE,0xF4 TENSOR_SCALAR_INT_WIDE— the enum names are read directly, but the byte value and dispatch trampoline are FLIX-desynced / not in a clean carve. These six are the----Yrows.
GOTCHA —
search-clusterops are MARIANA, not MAVERICK additions. The ops0x6C/0x6D/0x6E/0x6F(YYYYY) are pre-existing MARIANA DVE opcodes, not v5 additions; at MAVERICK they are merely PROF-armed onto the DVE engine (a profile-table change, not opcode growth). Do not double-count them as MAVERICK-new.[HIGH/OBSERVED]
The MED per-gen device-body tail carried explicitly (these rows are dispatch-placed
- named HIGH, body MED): SUNDA RELEASE/zero-log + out-of-corpus EXTISA container (the
BF16 cluster
0x8A–0x8F, dual-ptr0x87/0x88); MAVERICK0xF3/0xF4and0x26 ACTIVATE_MULTIPASS(header-OBSERVED only → INFERRED, no POOL DEBUG image); the FLIX-desync device interiors of the0xBD/0xF1SEQ FLIX-inline DMA-transpose handlers.
5. Phantom and wall callouts
CORRECTION — SortMerge is a PHANTOM. Do not document it as a live opcode. A task plan once named "SortMerge" as a hardware opcode to decode. There is no SortMerge HW opcode in any shipped enum. It survives only as a comment on the
0x98line of the maverick header:NEURON_ISA_TPB_OPCODE_TENSOR_SCALAR_SELECT = 0x98, // SortMerge wip 0x97 // Y. The byte0x97is never assigned to an opcode in any gen (it appears elsewhere only as the unrelatedUPDATE_MODE_SEM_SUB_REG_COMPLETE = 0x97in a different enum), and0x98is the realTENSOR_SCALAR_SELECT(ts-select). SortMerge is named-but-never-shipped. See confidence-model §4.5.[HIGH/OBSERVED — maverick header line read this session.]
QUIRK — MAVERICK
0xF3/0xF4are header-OBSERVED only (INFERRED placement). The INT_WIDE pair is named in the maverick enum but has no POOL DEBUG image carrying a clean device body — the dispatch trampoline is FLIX-desynced. The names are HIGH; the byte value, engine split (DVE vs POOL), and operand struct are MED/INFERRED. Marked†MEDin the table.[INFERRED]
WALL — FLIX-desync device interiors. Several POOL/DMA bodies (
0x45Pool inner reduce,0xBD/0xF1DMA-transpose, the MAVERICK late ops) sit inside FLIX/VLIW bundles that the linearncore2gpdisassembler resyncs imperfectly. Their opcode, dispatch slot, andfuncVAare byte-exact; only the instruction interior is MED. This is the corpus-wide MED ceiling (confidence-model §4.4), not a per-kernel defect.
6. Coverage tally (over the 140 real HW opcodes)
| Bucket | Count | % |
|---|---|---|
Body-decoded (a per-kernel page or a dormant; covered decode) | 78 | 55.7% |
| Planned (per-kernel page authored separately in this cluster) | 11 | 7.9% |
| NONE (no body decode) | 51 | 36.4% |
| Total | 140 | 100% |
The 51 NONE, split by maintenance flag (latest-present-gen char): 43 maintained
(// Y) + 8 dormant (// n). The 43 maintained-NONE further split into 14 SEQ
control-spine (named in the dispatch hub, no dedicated body —
ENGINE_NOP, HALT, DRAIN, NOP, NOTIFY, the semaphore/poll ops, …) and 29
genuine compute/DMA/ACT gap (the true remaining kernel-lane decode debt — the
maintained gap rows above).
NOTE — dormant reconciliation. There are 20 dormant (
// n) opcodes total; 8 areNONE(0x04,0x05,0x4A,0x4B,0x4C,0x73,0x81,0x9C) and 12 aredormant; covered(0x44,0x4F,0x54,0x5F,0x60,0x63,0x64,0x70,0x71,0x76,0x87,0x88). Re-verified this session:8 + 12 = 20, exactly the dormant set.[HIGH/OBSERVED]
7. The index — per-kernel pages this ledger catalogs
This page is the anchor for the kernels cluster. Each real opcode's body is documented on a dedicated page (authored separately). The major ones, by family:
- Tensor-Tensor / Tensor-Scalar / Reduce: tensor-tensor · tensor-scalar · tensor-reduce · scalar-tensor-tensor · tensorcumulative · tensor-tensor-scan
- Copy / Cast / Pool / Iota: cast-copy · avg-max-pool · iota · cross-lane-reduce · stream-transpose
- PE / ACT: pe-matmul · activate-pwl
- Quantize / codec: tensor-dequantize · mx-dequant · convlutload · cptc-codec
- Indirection / DMA: indirection-gather · rangeselect · sb2sb-remote-copy
- Search / select / predicated: search-cluster · sort · ts-select · castpredicated · copypredicatedreduce
- RNG / dropout / batchnorm: rng-lfsr-dispatch · rand2 · dropout · batchnorm-forward · batchnorm-backprop
- Sparsity / sequence / nonzero: sparsity-compress-tag · get-sequence-bounds · nonzero-with-count
- NX control: move-dtype · alu-op-matrix · tensorload · tensorstore
NOTE — forward-links. The per-kernel pages above are authored separately in this cluster; some rows in §2 tagged (planned) point at pages that document a search/select/predicated/DVE sibling not yet body-decoded — those are forward-links to in-cluster stubs. The table's opcode → name → presence facts here are byte-grounded regardless of per-page authoring state.
Dispatch-mechanism cross-links (committed siblings): the
POOL main dispatch loop (SEQ↔Q7 hand-off) · the
kernel_info_table byte layout (the 17-entry table) ·
the 0xF0 extended sub-dispatch (the 5-spec bridge) · the
SEQ ASCII dispatch hub (the 178-slot fetch table) · the
Confidence & Walls model.