mirror of
https://github.com/odin-lang/Odin.git
synced 2026-09-02 02:03:35 +00:00
SSAT, SSAT16, USAT and USAT16 encode their saturate position minus one, and SBFX and UBFX their width minus one, so a field of zero means one. All of them printed the raw field, which is not a value the instruction can take -- `ssat r0, #0, r0` is not assemblable. BFI and BFC are different again: their field is the top bit's position, and the width the syntax wants is msb - lsb + 1. They shared an encoding with SBFX and UBFX, which need the opposite arithmetic, so they now have their own. Packing an msb needs the lsb from a sibling operand, so the packer takes the instruction rather than one operand in isolation. Also worth recording: the sweep had been running llvm-mc with `-mattr=+all`, which that target does not recognise and silently ignores, so every CRC32, FP16, v8.1a and dot-product entry looked like a reserved encoding. With the features actually enabled, 815 of 1139 A32 entries round-trip, and 38 rather than 143 are genuinely reserved. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018UmHLRF11EoWwNWCJ7JGaA