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