Address alignment in A64 code
If alignment checking is not enabled, then unaligned accesses are permitted for all load and store instructions other than exclusive load, exclusive store, load acquire, and store release instructions. If alignment checking is enabled, then unaligned accesses are not permitted.
With alignment checking enabled, all load and store instructions must use addresses that are aligned to the size of the data being accessed:
- Addresses for 8-byte transfers must be 8-byte aligned.
- Addresses for 4-byte transfers are 4-byte word-aligned.
- Addresses for 2-byte transfers are 2-byte aligned.
Unaligned accesses cause an alignment exception.
For any memory access, if the stack pointer is used as the base register, then it must be quadword-aligned. Otherwise it generates a stack alignment exception.
If all your data accesses are aligned, you can use the
--no_unaligned_access command-line option to declare that the output object was not permitted to make unaligned access. If all input objects declare that they are not permitted to use unaligned accesses, then the linker can avoid linking in any library functions that support unaligned access.