This change introduces the Arm 8.8-A instructions for FEAT_MOPS. Documentation for these instructions can be found in the A64 ISA documentation.
There are a lot of variants so I won't link to all of the documentation individually here. There are four basic operations with the following prefixes:
- CPYP*: Memory copy
- CPYF*: Memory copy, forward-only
- SET*: Memory Set
- SETG*: Memory Set with tag setting, which requires FEAT_MTE in addition to FEAT_MOPS
For each of these operations there are three instructions differentiated by P/M/E for preconditioning/main/end. For example, SETGP, SETGM, SETGE.
For each set of three instructions there are also variants for privileged/unprivileged and temporal/non-temporal e.g. CPYPTN, CPYMTN, CPYETN
For the copy instructions, you can separately specify the read and write translations (so that kernels can safely use these instructions in syscall handlers, to memcpy between the calling process's user-space memory map and the kernel's own privileged one).
Some of these instructions write back to multiple registers to indicate progress in the event of interrupts. Contrary to the previous description of these instructions, they are not required to be placed in a loop.
Patch by Simon Tatham, Victor Campos, Tomas Matheson and Sam Elliott
Should this be hasNoSchedulingInfo? Can we remove this or include something very basic?
Should something here be marking them MayLoad and MayStore? They may already be hasSideEffects, as nothing marks them otherwise and they do not have codegen patterns, which is more strict. But it's probably good to be explicit.