[codex] Regenerate Linx model tables for v0.57 blocks#3
Conversation
Generated ISA tables now describe B.ITP, B.OTA, BSTART.CUBE, BSTART.TMA, and BSTART.FIXP names used by the v0.57 block contract. Constraint: linx-model generated tables must match the public v0.57 descriptor spelling consumed by compiler, QEMU, and GFSIM Rejected: Keep B.IOT/B.IOTI names in generated tables | they conflict with the split descriptor contract Confidence: high Scope-risk: narrow Tested: python3 tools/isa/check_pto_v057_downstream.py --strict Not-tested: Full linx-model regeneration pipeline
There was a problem hiding this comment.
Code Review
This pull request updates several instruction definitions in the generated ISA tables, renaming and restructuring block input/output and block split instructions (such as B.IOT to B.ITP, B.IOTI to B.OTA, and various BSTART forms). However, the changes introduce critical decoding and assembly ambiguities: both B.ITP and B.OTA instruction forms have identical mask and match values, which prevents the decoder from distinguishing between forms with and without the 'last' modifier. Additionally, renaming a block split instruction to BSTART.FIXP creates a duplicate assembly template with an existing entry, causing assembly ambiguity.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| .mnemonic = "B.ITP", | ||
| .asm_template = "B.ITP [SrcTile0<.reuse>, SrcTile1<.reuse>], last, src_pair", | ||
| .encoding_kind = "L32", | ||
| .group = "Block Input & Output", | ||
| .uop_group = "CMD", | ||
| .uop_big_kind = "CMD", | ||
| .length_bits = 32, | ||
| .fixed_bits = 10, | ||
| .mask = 0x707fULL, | ||
| .match = 0x5013ULL, | ||
| .mask = 0x70ffULL, | ||
| .match = 0x2013ULL, | ||
| .field_start = 77, | ||
| .field_count = 8, | ||
| .constraint_start = 1, | ||
| .constraint_count = 0}, | ||
| {.uid = "f6b1a38eb134", | ||
| .mnemonic = "B.IOT", | ||
| .asm_template = "B.IOT [SrcTile0<.reuse>, SrcTile1<.reuse>], group=0, ->DstTile<RegSrc>", | ||
| .mnemonic = "B.ITP", | ||
| .asm_template = "B.ITP [SrcTile0<.reuse>, SrcTile1<.reuse>], src_pair", | ||
| .encoding_kind = "L32", | ||
| .group = "Block Input & Output", | ||
| .uop_group = "CMD", | ||
| .uop_big_kind = "CMD", | ||
| .length_bits = 32, | ||
| .fixed_bits = 10, | ||
| .mask = 0x707fULL, | ||
| .match = 0x4013ULL, | ||
| .mask = 0x70ffULL, | ||
| .match = 0x2013ULL, |
There was a problem hiding this comment.
Both B.ITP instruction forms (UID 5537088c4f03 and f6b1a38eb134) have identical .mask (0x70ffULL) and .match (0x2013ULL) values. This creates a decoding ambiguity because the instruction decoder cannot uniquely distinguish between the form with the last modifier and the form without it based on the opcode mask and match. If last corresponds to a specific bit in the instruction encoding, that bit needs to be included in the mask and differentiated in the match values (similar to how bit 12 was used to distinguish the original B.IOT forms).
| .mnemonic = "B.OTA", | ||
| .asm_template = "B.OTA ->DstTile<CellCountM1>, dst_slot", | ||
| .encoding_kind = "L32", | ||
| .group = "Block Input & Output", | ||
| .uop_group = "CMD", | ||
| .uop_big_kind = "CMD", | ||
| .length_bits = 32, | ||
| .fixed_bits = 10, | ||
| .mask = 0x707fULL, | ||
| .match = 0x6013ULL, | ||
| .mask = 0x70ffULL, | ||
| .match = 0x3013ULL, | ||
| .field_start = 93, | ||
| .field_count = 8, | ||
| .constraint_start = 1, | ||
| .constraint_count = 0}, | ||
| {.uid = "fb045cf4149a", | ||
| .mnemonic = "B.IOTI", | ||
| .asm_template = "B.IOTI [SrcTile0<.reuse>, SrcTile1<.reuse>], group=1, ->DstTile<Size>", | ||
| .mnemonic = "B.OTA", | ||
| .asm_template = "B.OTA ->DstTile<CellCountM1>, last, dst_slot", | ||
| .encoding_kind = "L32", | ||
| .group = "Block Input & Output", | ||
| .uop_group = "CMD", | ||
| .uop_big_kind = "CMD", | ||
| .length_bits = 32, | ||
| .fixed_bits = 10, | ||
| .mask = 0x707fULL, | ||
| .match = 0x7013ULL, | ||
| .mask = 0x70ffULL, | ||
| .match = 0x3013ULL, |
There was a problem hiding this comment.
Both B.OTA instruction forms (UID 0be0ecce86bb and fb045cf4149a) have identical .mask (0x70ffULL) and .match (0x3013ULL) values. This causes a decoding collision where the decoder cannot differentiate between the form with the last modifier and the form without it. The mask and match values must be updated to incorporate the bit that distinguishes these two forms.
| .mnemonic = "BSTART.FIXP", | ||
| .asm_template = "BSTART.FIXP Function, DataType", |
There was a problem hiding this comment.
Renaming this form (UID 211446509efb) to BSTART.FIXP with the template BSTART.FIXP Function, DataType creates a duplicate assembly template with the existing BSTART.FIXP form (UID 3b0ae11126a6 on line 5142). This duplicate template causes assembly ambiguity, as the assembler cannot distinguish between the two forms during code generation. If these forms are now unified, they should be merged into a single entry rather than maintained as separate entries with identical assembly templates.
The generated B.ITP and B.OTA descriptor rows need distinct last-bit encodings, and fixed opcode bits must dominate overlapping field packing. This records the reviewed descriptor forms and adds a unit smoke to keep last/non-last encodings separated. Constraint: v0.57 has no legacy block descriptor mode to fall back to. Confidence: high Scope-risk: narrow Tested: cmake --build build --target linx_model_ut_minst -j8 Tested: ./build/linx_model_ut_minst
Summary
Regenerates linx-model ISA tables for the v0.57 descriptor names and block classes:
B.IOT/B.IOTItable forms withB.ITPandB.OTABSTART.CUBE,BSTART.TMA, andBSTART.FIXPtable names/templatesValidation
python3 tools/isa/check_pto_v057_downstream.py --strictfrom the superprojectNotes
This is the generated-table companion to the v0.57 block definition in the superproject.