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