6.43.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-5.5.0/gcc/Simple-Constraints.html