static_assert(rex::ppc::detail::IsMidAsmAddress(address), \
"REX_MIDASM_AT address must be a nonzero multiple of 4"); \
REX_DETAIL_MIDASM_AT_CHECK(name, #placement, #__VA_ARGS__, kBadPlacement, \
"REX_MIDASM_AT placement must be before or after"); \
REX_DETAIL_MIDASM_AT_CHECK(name, #placement, #__VA_ARGS__, kUnexpectedTarget, \
"REX_MIDASM_AT takes a target only for a branch body"); \
REX_DETAIL_MIDASM_AT_CHECK(name, #placement, #__VA_ARGS__, kMissingTarget, \
"REX_MIDASM_AT needs the target of a branch body first"); \
REX_DETAIL_MIDASM_AT_CHECK(name, #placement, #__VA_ARGS__, kBadTarget, \
"REX_MIDASM_AT target must be a nonzero multiple of 4"); \
REX_DETAIL_MIDASM_AT_CHECK(name, #placement, #__VA_ARGS__, kBadRegister, \
"REX_MIDASM_AT register must be r0 to r31 except r1, f0 to f31, " \
"v0 to v127, cr0 to cr7, ctr, xer, fpscr, reserved or ctx"); \
REX_DETAIL_MIDASM_AT_CHECK(name, #placement, #__VA_ARGS__, kCountMismatch, \
"REX_MIDASM_AT register count must equal the body parameters"); \
REX_DETAIL_MIDASM_AT_CHECK(name, #placement, #__VA_ARGS__, kTypeMismatch, \
"REX_MIDASM_AT register type does not fit its parameter")
Attaches a mid asm body at an instruction address. A branch body takes its target first, then every body takes one register token per parameter, ctx for a PPCContext parameter. A line that does not fit its body fails to compile.