6.42.3 Символы модификаторов ограничений
Вот символы модификаторов ограничений.
- ‘
=’ - Означает, что этот операнд является только для записи для данной инструкции: предыдущее значение отбрасывается и заменяется выходными данными.
- ‘
+’ - Означает, что этот операнд считывается и записывается инструкцией.
При исправлении операндов компилятором для удовлетворения ограничений ему необходимо знать, какие операнды являются входными для инструкции, а какие – выходными. ‘
=’ идентифицирует выходной операнд; ‘+’ идентифицирует операнд, который является как входным, так и выходным; все остальные операнды считаются только входными.Если вы указываете ‘
=’ или ‘+’ в ограничении, поместите его в первый символ строки ограничения. - ‘
&’ - Означает (в конкретной альтернативе), что этот операнд является операндом раннего захвата, который изменяется до завершения инструкции с использованием входных операндов. Поэтому этот операнд не может находиться в регистре, используемом в качестве входного операнда или в качестве части любого адреса памяти.
‘
&’ применяется только к альтернативе, в которой он записывается. В ограничениях с несколькими альтернативами иногда одна альтернатива требует ‘&’, а другие – нет. См., например, инструкцию ‘movdf’ процессора 68000.Входной операнд может быть связан с операндом раннего захвата, если его единственное использование в качестве входного происходит до записи раннего результата. Добавление альтернатив такого типа часто позволяет GCC генерировать лучший код, когда только некоторые из входных данных могут быть затронуты ранним захватом. См., например, инструкцию ‘
mulsi3’ ARM.‘
&’ не отменяет необходимости в написании ‘=’. - ‘
%’ - Объявляет инструкцию коммутативной для данного операнда и следующего операнда. Это означает, что компилятор может поменять местами два операнда, если это самый дешёвый способ сделать так, чтобы все операнды соответствовали ограничениям. GCC может обрабатывать только одну коммутативную пару в asm; если вы используете больше, компилятор может завершиться ошибкой. Обратите внимание, что вам не нужно использовать модификатор, если две альтернативы строго идентичны; это лишь потратит время на проходе перегрузки. Модификатор не активен после выделения регистров, поэтому результат
define_peephole2иdefine_splitпосле перегрузки не может полагаться на ‘%’, чтобы сделать целевую инструкцию соответствующей. - ‘
#’ - Указывает, что все последующие символы до следующей запятой должны игнорироваться как ограничение. Они важны только для выбора предпочтений регистров.
- ‘
*’ - Указывает, что следующий символ должен быть проигнорирован при выборе предпочтений регистров. ‘
*’ не влияет на смысл ограничения как ограничения и не влияет на перегрузку. Для LRA ‘*’ также немного снижает значимость альтернативы, если следующий символ соответствует операнду.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Modifiers.html