6.43.3.2 Множественные альтернативные ограничения
Иногда в одной инструкции могут быть несколько альтернативных наборов возможных операндов. Например, в инструкции логического ИЛИ 68000 можно объединять регистр или немедленное значение с памятью, или объединять любой тип операнда с регистром; но нельзя объединять одну ячейку памяти с другой.
Эти ограничения представлены как несколько альтернатив. Альтернатива может быть описана серией букв для каждого операнда. Общее ограничение для операнда формируется из букв для этого операнда из первой альтернативы, запятой, букв для этого операнда из второй альтернативы, запятой и так далее до последней альтернативы.
Если все операнды подходят под какую-либо одну альтернативу, инструкция является допустимой. В противном случае для каждой альтернативы компилятор подсчитывает, сколько инструкций необходимо добавить для копирования операндов, чтобы эта альтернатива применялась. Выбирается альтернатива, требующая наименьшего копирования. Если две альтернативы требуют одинакового количества копирования, выбирается та, которая указана первой. Эти варианты могут быть изменены символами ‘?’ и ‘!’:
?-
Незначительно ухудшает альтернативу, в которой появляется ‘?’, как выбор, когда ни одна альтернатива не применима точно. Компилятор рассматривает эту альтернативу как на единицу более дорогостоящую за каждый ‘?’, который в ней появляется.
!-
Сильно ухудшает альтернативу, в которой появляется ‘!’. Эта альтернатива всё ещё может быть использована, если она подходит без перезагрузки, но если требуется перезагрузка, будет использована другая альтернатива.
^-
Это ограничение аналогично ‘?’, но оно незначительно ухудшает альтернативу только в том случае, если операнду с ‘^’ нужна перезагрузка.
$Это ограничение аналогично ‘!’, но оно сильно ухудшает альтернативу только в том случае, если операнду с ‘$’ нужна перезагрузка.
Далее: Модификаторы, Предыдущее: Простые ограничения, Вверх: Ограничения [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/Multi-Alternative.html