Constraint codes define how to pass an operand between assembly code and the surrounding C or C++ code.
There are three categories of constraint codes:
Constant operands
You can only use these operands as input operands, and
they must be compile-time constants. Use where a value will be used as an
immediate operand to an instruction. There are target-specific constraints that
accept the immediate ranges suitable for different instructions.
Register operands
You can use these operands as both input and output
operands. The compiler allocates a register to store the value. As there are a
limited number of registers, it is possible to write an inline assembly
statement for which there are not enough available registers. In this case, the
compiler reports an error. The exact number of available registers varies
depending on the target architecture and the optimization level.
Memory operands
You can use these operands as both input and output
operands. Use them with load and store instructions. Usually a register is
allocated to hold a pointer to the operand. As there are a limited number of
registers, it is possible to write an inline assembly statement for which there
are not enough available registers. In this case, the compiler reports an error.
The exact number of available registers can vary depending on the target
architecture and the optimization level.
There are some common constraints, which can be used in both AArch32 state and
AArch64 state. Other constraints are specific to AArch32 state or AArch64 state. In
AArch32 state, there are some constraints that vary depending on the selected
instruction set.
Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers of your data.