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-13.3.0/gcc/Multi_002dAlternative.html