Files
Odin/core/rexcode
Brendan Punsky b8c391e9e1 rexcode/arm32: take the encoding-shaped names down to what assemblers spell
Of the 38 mnemonics still carrying an encoding-shaped name, 24 were simply
names no assembler accepts, and arm32's printer emits the enum name verbatim
-- so `vldrb_gather`, `vceq_z`, `vmov_q_r` and friends were the printed
output. Judged against llvm-mc in every case:

  renamed (base name was free)
    BFI_BR -> BFX      the V8.1M Branch Future indeXed, not a bitfield
                       insert; llvm assembles `bfx .L, r0` to F060E001,
                       which is exactly the bit pattern this entry held.
    VDOT_BF16  -> VDOT      `vdot.bf16 d0, d1, d2`
    VMMLA_BF16 -> VMMLA     `vmmla.bf16 q0, q1, q2`

  merged into the base mnemonic (21)
    VCEQ_Z/VCGE_Z/VCGT_Z/VCLE_Z/VCLT_Z -> the compare-against-zero forms
      are the same mnemonic with a literal `#0`: `vceq.i8 d0, d1, #0`.
    VCVT_FIXED, VCVT_BF16 -> VCVT      `vcvt.s16.f32 s0, s0, #4`
    VFMA_BF16 -> VFMA
    VLDR{B,H,W,D}_GATHER, VSTR{B,H,W,D}_SCATTER -> VLDR*/VSTR*: an MVE
      gather is spelled `vldrb.u8 q0, [r0, q1]`; the vector offset is an
      operand, not part of the mnemonic.
    VMOV_Q_R, VMOV_R_Q, VMOV_2GPR_Q -> VMOV
    VHCADD_SAT -> VHCADD, VCMLA_MVE -> VCMLA

  kept, but printed properly (2)
    PSB_CSYNC / TSB_CSYNC are written as two tokens, `psb csync`, the same
    shape as arm64's DC/AT/TLBI. The underscore now prints as a space; no
    other arm32 mnemonic has one.

Every merged form had an operand signature the matcher could already tell
apart from the base's, so nothing became unreachable. 631 -> 590 mnemonics,
underscore-bearing names 58 -> 14.

Test indices were re-derived by matching (bits, mask) against the rebuilt
table rather than by computing offsets -- every index the tests reference was
found, which is a check that the merge dropped no form.

Still blocked, and for the two reasons already known:
  VPADD_F, VRECPE_F, VRSQRTE_F  -- collide with their base because the NEON
    data type (.f32 vs .i8/.u32) is not an operand.
  VMOV_LANE, VLD1-4_LANE, VST1-4_LANE -- register lists and lane indices are
    not modelled.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 23:21:57 -04:00
..
2026-07-14 13:28:12 +01:00