Spec-Zone.ru › GCC 13

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

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

‘=’

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

‘+’

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

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

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

‘&’

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

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

Операнд, который считывается инструкцией, может быть связан с операндом earlyclobber, если его единственное использование в качестве входного операнда происходит до записи раннего результата. Добавление альтернатив такого типа часто позволяет GCC создавать более эффективный код, когда только некоторые входные операнды могут быть затронуты ранним операндом. См., например, инструкцию ‘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-13.3.0/gcc/Modifiers.html

Spec-Zone.ru

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