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-11.4.0/gcc/Multi-Alternative.html