Here is a small AArch64 bug:
bad_wrapper:
bl helper
retIt looks plausible if the mental model came from x86. Call a helper. Return to the caller. But AArch64 bl does not push a return address onto the stack. It writes the return address into the link register, x30. If bad_wrapper entered with its caller’s return address in x30, then bl helper overwrote it. The later ret no longer has the original link-register state.
A non-leaf wrapper usually has to preserve what it will need after the nested call:
good_wrapper:
stp x29, x30, [sp, #-16]!
mov x29, sp
bl helper
ldp x29, x30, [sp], #16
retThat is the claim: ARM64 is not x64 with a larger register file. The instruction set gives you registers. The ABI tells you which registers are part of the call packet, which ones are reserved, how the stack behaves, where the return address lives, and which platform rules apply.
AAPCS64 gives a clean first table. x0 through x7 are parameter/result registers. v0 through v7 carry floating-point and SIMD arguments. x30 is the link register. x29 is the frame pointer. x8 can be the indirect result location register.
That table is useful. It is not the whole ABI.
The sharp example is x18. Architecturally, it is a general-purpose register. ABI-wise, it has a passport problem. AAPCS64 defines it as platform-specific and warns portable hand-written assembly to avoid it. Windows ARM64 reserves x18 as a platform register. Code that casually uses it as scratch may work in one environment and violate the platform contract in another.
Stack rules have the same shape. Alignment, red zones, frame-pointer expectations, and unwind metadata are platform ABI properties, not facts you get from the words “ARM64.” ARM64EC makes the point even harder: it runs on ARM64 hardware, but follows x64-oriented software conventions for mixed ARM64/x64 interoperability on Windows.
The boundary is evidence. A register-file fact is not automatically an ABI fact. A base ABI fact is not automatically a platform fact. A platform ABI fact is not universal hardware behavior.
Ask which ARM64 ABI you are in before deciding what a register means.
Read the full essay on lospino.so: ARM64 Is Not Just x64 With More Registers
Original essay published on lospino.so on 2026-06-05. This Substack dispatch is an adapted pointer to the canonical version, not a mirrored copy.

