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