6.47.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’
-
Разрешается целочисленный операнд со значением по умолчанию, значение которого не является явным целым числом.
Это может показаться странным; если insn допускает операнд с константой со значением, неизвестным на этапе компиляции, то он, безусловно, должен допускать любое известное значение. Так почему используется ‘s’ вместо ‘i’? Иногда это позволяет сгенерировать лучший код.
Например, на 68000 в инструкции с полным словом можно использовать операнд со значением по умолчанию; но если значение со значением по умолчанию находится в диапазоне от -128 до 127, лучший код получается при загрузке значения в регистр и использовании регистра. Это связано с тем, что загрузка в регистр может быть выполнена инструкцией ‘moveq’. Мы организуем это, определив букву ‘K’ как «любое целое число вне диапазона от -128 до 127», а затем указав ‘Ks’ в ограничениях операнда.
- ‘g’
-
Разрешается любой операнд регистра, памяти или целочисленного значения со значением по умолчанию, за исключением регистров, которые не являются общими регистрами.
- ‘X’
-
Разрешается любой операнд.
- ‘0’, ‘1’, ‘2’, … ‘9’
-
Разрешается операнд, соответствующий указанному номеру операнда. Если цифра используется вместе с буквами в одном варианте, цифра должна быть последней.
Этот номер может быть больше одной цифры. Если встречаются несколько цифр подряд, они интерпретируются как одно десятичное целое число. Вероятность неоднозначности невелика, так как до сих пор не было желательно, чтобы ‘10’ интерпретировалось как соответствие либо операнду 1, либо операнду 0. Если это необходимо, можно использовать несколько вариантов.
Это называется ограничением сопоставления, и его истинный смысл заключается в том, что у ассемблера есть только один операнд, выполняющий две роли, которые
asmотличает. Например, инструкция add использует два входных операнда и один выходной операнд, но на большинстве машин CISC инструкция add фактически имеет только два операнда, один из которых является операндом вход-выход: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-9.5.0/gcc/Simple-Constraints.html