[[zam]]
== `Zam` Standard Extension for Misaligned Atomics, v0.1

This chapter defines the ``Zam`` extension, which extends the ``A``
extension by standardizing support for misaligned atomic memory
operations (AMOs). On platforms implementing ``Zam``, misaligned AMOs
need only execute atomically with respect to other accesses (including
non-atomic loads and stores) to the same address and of the same size.
More precisely, execution environments implementing ``Zam`` are subject
to the following axiom:

[[misaligned]]
=== Atomicity Axiom for misaligned atomics

If latexmath:[$r$] and latexmath:[$w$] are paired misaligned load and
store instructions from a hart latexmath:[$h$] with the same address and
of the same size, then there can be no store instruction latexmath:[$s$]
from a hart other than latexmath:[$h$] with the same address and of the
same size as latexmath:[$r$] and latexmath:[$w$] such that a store
operation generated by latexmath:[$s$] lies in between memory operations
generated by latexmath:[$r$] and latexmath:[$w$] in the global memory
order. Furthermore, there can be no load instruction latexmath:[$l$]
from a hart other than latexmath:[$h$] with the same address and of the
same size as latexmath:[$r$] and latexmath:[$w$] such that a load
operation generated by latexmath:[$l$] lies between two memory
operations generated by latexmath:[$r$] or by latexmath:[$w$] in the
global memory order.

This restricted form of atomicity is intended to balance the needs of
applications which require support for misaligned atomics and the
ability of the implementation to actually provide the necessary degree
of atomicity.

Aligned instructions under `Zam` continue to behave as they normally
do under RVWMO.

The intention of `Zam` is that it can be implemented in one of two
ways:

. On hardware that natively supports atomic misaligned accesses to the
address and size in question (e.g., for misaligned accesses within a
single cache line): by simply following the same rules that would be
applied for aligned AMOs.
. On hardware that does not natively support misaligned accesses to the
address and size in question: by trapping on all instructions (including
loads) with that address and size and executing them (via any number of
memory operations) inside a mutex that is a function of the given memory
address and access size. AMOs may be emulated by splitting them into
separate load and store operations, but all preserved program order
rules (e.g., incoming and outgoing syntactic dependencies) must behave
as if the AMO is still a single memory operation.

