6.45.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-7.5.0/gcc/Simple-Constraints.html