Spec-Zone.ru › GCC 5

6.43.3.3 Символы модификаторов ограничений

Вот символы модификаторов ограничений.

‘=’

Означает, что этот операнд записывается этой инструкцией: предыдущее значение отбрасывается и заменяется новыми данными.

‘+’

Означает, что этот операнд как читается, так и записывается инструкцией.

При корректировке операндов компилятором для удовлетворения ограничений необходимо знать, какие операнды читаются инструкцией, а какие записываются. ‘=’ идентифицирует операнд, который только записывается; ‘+’ идентифицирует операнд, который как читается, так и записывается; все остальные операнды предполагаются только для чтения.

Если вы указываете ‘=’ или ‘+’ в ограничении, вы размещаете его в первом символе строки ограничения.

‘&’

Означает (в конкретной альтернативе), что этот операнд — операнд earlyclobber, который записывается до завершения использования входных операндов инструкцией. Следовательно, этот операнд не может находиться в регистре, который читается инструкцией, или в качестве части любого адресного пространства памяти.

‘&’ применяется только к альтернативе, в которой он записывается. В ограничениях с несколькими альтернативами иногда одна альтернатива требует ‘&’, а другие — нет. См., например, инструкцию ‘movdf’ 68000.

Операнд, который читается инструкцией, может быть связан с операндом earlyclobber, если его единственное использование в качестве входного значения происходит до записи промежуточного результата. Добавление альтернатив такого типа часто позволяет GCC создавать более эффективный код, когда только некоторые из операндов чтения могут быть затронуты earlyclobber. См., например, инструкцию ‘mulsi3’ ARM.

Кроме того, если операнд earlyclobber также является операндом чтения/записи, то этот операнд записывается только после использования.

‘&’ не отменяет необходимости записи ‘=’ или ‘+’. Поскольку операнды earlyclobber всегда записываются, операнд earlyclobber только для чтения является некорректным и будет отклонен компилятором.

‘%’

Объявляет инструкцию коммутативной для этого операнда и следующего операнда. Это означает, что компилятор может поменять местами два операнда, если это наилучший способ разместить все операнды в соответствии с ограничениями. ‘%’ применяется ко всем альтернативам и должно появляться как первый символ в ограничении. Только операнды только для чтения могут использовать ‘%’.

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-5.5.0/gcc/Modifiers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API