Register offset and extended-register offset are one instruction word -- the option field at 15:13 picks LSL / UXTW / SXTW / SXTX -- but only LSL was reachable: no encode form used MEM_EXT, so [Xn, Wm, SXTW #s] had a matcher, a packer, and no way to be asked for. Worse, decoding such a word produced mode REG_OFFSET with a stray extend, which re-encoded as LSL -- a silent corruption round-trip. The one MEM_REG form now serves both modes, the way the RM slot takes plain and shifted registers: the matcher accepts EXT_REG_OFFSET and checks the index width against the extend (UXTW/SXTW take Wm, UXTX/SXTX take Xm, the byte/half extends match nothing -- and a REG_OFFSET index must now be an X register), the OFFSET_REG packer writes option from the operand's mode, and the decoder derives the mode from option rather than from which form matched. MEM_EXT/OFFSET_EXT stay in their enums -- the values are baked into the table blobs -- marked subsumed. Also fixed while there: the decoder stored the raw S bit as the shift amount, so LDR X0, [X1, X2, LSL #3] decoded -- and printed -- as LSL #1. The amount is log2 of the transfer size, recovered from size(31:30) and, for SIMD, opc<1>(23). The one thing Memory cannot represent is a byte access with an explicit #0 (S=1, amount 0); it decodes as no amount. New pipeline tests: ten llvm-mc golden words across the extends and widths, decode/print round-trips matching llvm's canonical spelling, the LSL amount, and four malformed-operand rejections. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AFeLCDKi5kRMtHrskUaRfw
The Data-Oriented Language for Sane Software Development.
The Odin Programming Language
Odin is a general-purpose programming language with distinct typing, built for high performance, modern systems, and built-in data-oriented data types. The Odin Programming Language, the C alternative for the joy of programming.
Website: https://odin-lang.org/
package main
import "core:fmt"
main :: proc() {
program := "+ + * 😃 - /"
accumulator := 0
for token in program {
switch token {
case '+': accumulator += 1
case '-': accumulator -= 1
case '*': accumulator *= 2
case '/': accumulator /= 2
case '😃': accumulator *= accumulator
case: // Ignore everything else
}
}
fmt.printf("The program \"%s\" calculates the value %d\n",
program, accumulator)
}
Documentation
Getting Started
Instructions for downloading and installing the Odin compiler and libraries.
Nightly Builds
Get the latest nightly builds of Odin.
Learning Odin
Overview of Odin
An overview of the Odin programming language.
Frequently Asked Questions (FAQ)
Answers to common questions about Odin.
Packages
Documentation for all the official packages part of the core and vendor library collections.
Examples
Examples on how to write idiomatic Odin code. Shows how to accomplish specific tasks in Odin, as well as how to use packages from core and vendor.
Odin Documentation
Documentation for the Odin language itself.
Odin Discord
Get live support and talk with other Odin programmers on the Odin Discord.
Articles
The Odin Blog
The official blog of the Odin programming language, featuring announcements, news, and in-depth articles by the Odin team and guests.
Warnings
- The Odin compiler is still in development.