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