6.47.3.2 Множественные альтернативные ограничения
Иногда одно единственное наставление имеет несколько альтернативных наборов возможных операндов. Например, на 68000, команда логического ИЛИ может комбинировать регистр или немедленное значение в память, или может комбинировать любой вид операнда в регистр; но она не может комбинировать одну ячейку памяти в другую.
Эти ограничения представлены как множественные альтернативы. Альтернатива может быть описана последовательностью букв для каждого операнда. Общее ограничение для операнда формируется из букв для этого операнда из первой альтернативы, запятой, букв для этого операнда из второй альтернативы, запятой, и так далее до последней альтернативы. Все операнды для одной команды должны иметь одинаковое количество альтернатив.
Итак, первая альтернатива для логического ИЛИ 68000 могла бы быть записана как "+m" (output) : "ir" (input). Вторая могла бы быть "+r"
(output): "irm" (input). Однако тот факт, что две ячейки памяти не могут быть использованы в одной команде, препятствует простому использованию "+rm"
(output) : "irm" (input). Используя многоальтернативные ограничения, это можно записать как "+m,r" (output) : "ir,irm" (input). Это описывает все доступные альтернативы компилятору, позволяя ему выбрать наиболее эффективную для текущих условий.
Внутри шаблона нет способа определить, какая альтернатива была выбрана. Тем не менее, вы можете обернуть свои asm выражения встроенными функциями, такими как __builtin_constant_p, чтобы достичь желаемых результатов.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Multi-Alternative.html