Spec-Zone.ru › GCC 15

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

Ниже перечислены символы-модификаторы ограничений.

‘=’

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

‘+’

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

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

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

‘&’

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

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

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

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

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

‘%’

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

GCC может обработать в asm только одну коммутативную пару; при использовании большего числа пар компилятор может завершиться с ошибкой. Обратите внимание, что модификатор не требуется, если два варианта полностью идентичны: он лишь замедлит этап перезагрузки.

‘-’

Указывает, что следующие ограничения в том же варианте следует сопоставлять особым образом. Обычно в коде PIC символьные операнды в ограничениях вроде ‘i’, ‘s’ или ‘n’ полностью запрещены или существенно ограничены. Модификатор ‘-’, который разрешён только вне функций, позволяет использовать символьные операнды даже в коде PIC. Этот модификатор обычно применяется вместе с модификатором операнда cc.

extern void foo (void), bar (void);
int v;
extern int w;
asm (".globl %cc0, %cc2; .text; %cc0: call %cc1; ret; .data; %cc2: .word %cc3"
     :: ":" (foo), "-s" (&bar), ":" (&w), "-i" (&v));

Это объявление asm сообщает компилятору, что оно определяет функцию foo и переменную w, а также использует функцию bar и переменную v. Этот код скомпилируется даже в режиме PIC, однако пользователь должен сам убедиться, что он будет корректно собран и будет вести себя ожидаемым образом.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Modifiers.html

Spec-Zone.ru

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