Files
Odin/core/rexcode/isa/arm64/tools
Brendan Punsky 5627cc94d6 rexcode/arm64: add the cset/csetm/cinc/cinv/cneg aliases
These are what an assembler writes -- and what one prints back -- for
CSINC/CSINV/CSNEG with the condition inverted, and none of the five
existed. A disassembly of `cset w0, eq` came out as
`csinc w0, wzr, wzr, ne`.

Two constraints the table could not state before:

  - The condition is stored inverted, so COND_HI_INV packs `cond ~ 1`
    and reads it back the same way. The printer needs nothing; the
    decoder hands it a plain condition operand.

  - cinc/cinv/cneg are only the alias when Rn == Rm, which is a
    cross-field equality no mask expresses. One operand fills both
    slots on the way in (RN_RM), and decode checks the two fields agree
    before accepting the entry -- reached only on a mask match, so it
    costs nothing in the scan.

The aliases also require cond != 111x. That one *is* expressible: the
14 legal values are covered exactly by three masked patterns (0xxx,
10xx, 110x), so AL and NV fall through to the underlying instruction
the way llvm-mc does. COND_NOT_AL rejects them on the encode side.

Verified against llvm-mc across all five mnemonics, both widths and all
14 conditions: 140/140 of our printed strings assemble to exactly our
bytes. Disassembly agrees except for cs/hs and cc/lo, which is the
package's existing spelling of those two conditions and shows up on
CSEL and B.cond alike. AL/NV and Rn != Rm both fall through correctly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018UmHLRF11EoWwNWCJ7JGaA
2026-08-27 08:59:59 -04:00
..