Spec-Zone.ru › GCC 12

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 в инструкции fullword можно использовать непосредственный операнд; но если значение непосредственного операнда находится в диапазоне от -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-12.2.0/gcc/Simple-Constraints.html

Spec-Zone.ru

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