6.44.3.1 Простые ограничения
Простейший вид ограничения — это строка, заполненная буквами, каждая из которых описывает один тип операнда, который разрешен. Вот разрешенные буквы:
- пробелы
-
Символы пробелов игнорируются и могут быть вставлены в любой позиции, кроме первой. Это позволяет визуально выравнивать каждый вариант для разных операндов в описании машины, даже если у них разное количество ограничений и модификаторов.
- ‘m’
-
Разрешен операнд памяти с любым типом адреса, который машина поддерживает в общем случае. Обратите внимание, что букву, используемую для общего ограничения памяти, можно переопределить с помощью макроса
TARGET_MEM_CONSTRAINT. - ‘o’
-
Разрешен операнд памяти, но только если адрес является смещаемым. Это означает, что к адресу можно добавить небольшое целое число (фактически, ширину операнда в байтах, определяемую его режимом машины), и результат также будет действительным адресом памяти.
Например, смещаемым является адрес, который является константой; смещаемым также является адрес, который является суммой регистра и константы (поскольку немного большая константа также находится в диапазоне поддерживаемых машиной смещений адреса); но адрес с автоинкрементом или автодекрементом не является смещаемым. Более сложные косвенные/индексированные адреса могут быть или не быть смещаемыми в зависимости от других режимов адресации, которые поддерживает машина.
Обратите внимание, что в выходном операнде, который может соответствовать другому операнду, буква ограничения ‘o’ допустима только при одновременном наличии ‘<’ (если целевая машина поддерживает адресацию с предварительным декрементом) и ‘>’ (если целевая машина поддерживает адресацию с предварительным инкрементом).
- ‘V’
-
Операнд памяти, который не является смещаемым. Другими словами, любой операнд, который соответствует ограничению ‘m’, но не ограничению ‘o’.
- ‘<’
-
Разрешен операнд памяти с адресацией автодекремента (прежде всего, предварительный декремент или постдекремент). В инлайне
asmэто ограничение разрешено только в том случае, если операнд используется ровно один раз в инструкции, которая может обрабатывать побочные эффекты. Не использование операнда с ‘<’ в строке ограничений в шаблоне инлайнаasmвообще или использование его в нескольких инструкциях недопустимо, потому что побочные эффекты не будут выполняться или будут выполняться более одного раза. Кроме того, на некоторых целевых системах операнд с ‘<’ в строке ограничений должен сопровождаться специальными суффиксами инструкций, такими как%U0суффикс инструкции для PowerPC или%P0для IA-64. - ‘>’
-
Разрешен операнд памяти с адресацией автоинкремента (прежде всего, предварительный инкремент или постинкремент). В инлайне
asmприменяются те же ограничения, что и для ‘<’. - ‘r’
-
Разрешен операнд регистра, при условии, что он находится в общем регистре.
- ‘i’
-
Разрешен целочисленный операнд со значением (с постоянным значением). Это включает символические константы, значения которых будут известны только во время ассемблирования или позже.
- ‘n’
-
Разрешен целочисленный операнд со значением, имеющим известное численное значение. Многие системы не могут поддерживать константы во время ассемблирования для операндов, имеющих ширину менее одного слова. Ограничения для таких операндов должны использовать ‘n’ вместо ‘i’.
- ‘I’, ‘J’, ‘K’, … ‘P’
-
Другие буквы в диапазоне от ‘I’ до ‘P’ могут быть определены в зависимости от машины, чтобы разрешить целочисленные операнды со значениями, имеющими явные значения целых чисел в заданных диапазонах. Например, на 68000 ‘I’ определено для диапазона значений от 1 до 8. Это диапазон, разрешенный в качестве счётчика сдвига в инструкциях сдвига.
- ‘E’
-
Разрешен операнд с плавающей точкой (код выражения
const_double), но только если формат плавающей точки целевой машины совпадает с форматом машины-хоста (на которой выполняется компилятор). - ‘F’
-
Разрешен операнд с плавающей точкой (код выражения
const_doubleилиconst_vector). - ‘G’, ‘H’
-
‘G’ и ‘H’ могут быть определены в зависимости от машины, чтобы разрешить операнды с плавающей точкой в определённых диапазонах значений.
- ‘s’
-
Разрешен целочисленный операнд, значение которого не является явным целым числом.
Это может показаться странным; если инструкция разрешает операнд с константой со значением, неизвестным во время компиляции, она, безусловно, должна разрешить любое известное значение. Так зачем использовать ‘s’ вместо ‘i’? Иногда это позволяет сгенерировать лучший код.
Например, на 68000 в инструкции с полным словом можно использовать операнд со значением; но если значение находится в диапазоне от -128 до 127, лучший код получается путём загрузки значения в регистр и использованием регистра. Это происходит потому, что загрузка в регистр может быть выполнена с помощью инструкции ‘moveq’. Мы организуем это, определив букву ‘K’ как «любое целое число за пределами диапазона от -128 до 127», а затем указав ‘Ks’ в ограничениях операнда.
- ‘g’
-
Разрешён любой регистровый, запоминающий или целочисленный операнд со значением, за исключением регистров, которые не являются общими регистрами.
- ‘X’
-
Разрешён любой операнд.
- ‘0’, ‘1’, ‘2’, … ‘9’
-
Разрешен операнд, соответствующий указанному номеру операнда. Если цифра используется вместе с буквами в одном и том же варианте, цифра должна стоять в конце.
Этот номер может быть больше одной цифры. Если встречаются несколько цифр подряд, они интерпретируются как одно десятичное целое число. Вероятность неоднозначности невелика, так как до сих пор не было желательно, чтобы ‘10’ интерпретировалось как соответствие либо операнду 1, либо операнду 0. Если это необходимо, можно использовать несколько вариантов вместо этого.
Это называется ограничением соответствия, и на самом деле это означает, что у ассемблера есть только один операнд, который выполняет две роли, которые
asmотличает. Например, инструкция сложения использует два входных операнда и один выходной операнд, но на большинстве машин CISC инструкция сложения на самом деле имеет только два операнда, один из них — операнд вход/выход:addl #35,r12
Ограничения соответствия используются в таких обстоятельствах. Более точно, два соответствующих операнда должны включать один операнд только для ввода и один операнд только для вывода. Кроме того, цифра должна быть меньше, чем номер операнда, который её использует в ограничении.
- ‘p’
-
Разрешен операнд, являющийся допустимым адресом памяти. Это для инструкций «загрузка адреса» и «загрузка адреса в стек».
‘p’ в ограничении должно сопровождаться
address_operandв качестве предиката вmatch_operand. Этот предикат интерпретирует режим, указанный вmatch_operand, как режим обращения к памяти, для которого адрес будет допустим. - other-letters
Другие буквы могут быть определены в зависимости от машины, чтобы обозначать определённые классы регистров или другие произвольные типы операндов. ‘d’, ‘a’ и ‘f’ определены на 68000/68020 для обозначения регистров данных, адресов и с плавающей точкой.
Далее: Многовариантные, Назад: Ограничения [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Simple-Constraints.html