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