Spec-Zone.ru › GCC 8

6.45.3.1 Простые ограничения

Простейший вид ограничения — это строка, заполненная буквами, каждая из которых описывает один тип разрешенного операнда. Вот разрешенные буквы:

пробелы

Символы пробелов игнорируются и могут быть вставлены в любом месте, кроме первого. Это позволяет визуально выравнивать каждую альтернативу для разных операндов в описании машины, даже если у них разное количество ограничений и модификаторов.

‘m’

Разрешен операнд памяти с любым типом адреса, который машина поддерживает в общем случае. Обратите внимание, что букву, используемую для общего ограничения памяти, можно переопределить с помощью макроса TARGET_MEM_CONSTRAINT.

‘o’

Разрешен операнд памяти, но только если адрес является смещаемым. Это означает, что к адресу можно добавить небольшое целое число (на самом деле, ширину операнда в байтах, определяемую его режимом машины), и результат также будет допустимым адресом памяти.

Например, смещаемым является адрес, который является константой; смещаемым также является адрес, который является суммой регистра и константы (пока несколько большая константа также находится в диапазоне поддерживаемых машиной смещений адреса); но адрес с автоматическим инкрементом или декрементом не является смещаемым. Более сложные косвенные/индексированные адреса могут или не могут быть смещаемыми в зависимости от других режимов адресации, поддерживаемых машиной.

Обратите внимание, что в выходном операнде, который может быть сопоставлен с другим операндом, буква ограничения ‘o’ допустима только при сопровождении и ‘<’ (если целевая машина имеет адресацию с предварительным уменьшением) и ‘>’ (если целевая машина имеет адресацию с предварительным увеличением).

‘V’

Операнд памяти, который не является смещаемым. Другими словами, всё, что удовлетворяет ограничению ‘m’, но не ‘o’.

‘<’

Разрешен операнд памяти с адресацией с автоматическим уменьшением (либо предварительное уменьшение, либо постдекремент). Встраиваемом asm это ограничение допускается только в том случае, если операнд используется ровно один раз в инструкции, которая может обрабатывать побочные эффекты. Неиспользование операнда с ‘<’ в строке ограничений во встроенном asm шаблоне или использование его в нескольких инструкциях недопустимо, потому что побочные эффекты не будут выполняться или будут выполняться более одного раза. Кроме того, на некоторых целевых платформах операнд с ‘<’ в строке ограничений должен сопровождаться специальными суффиксами инструкций, например, %U0 суффиксом инструкции на PowerPC или %P0 на IA-64.

‘>’

Разрешен операнд памяти с адресацией с автоматическим увеличением (либо предварительное увеличение, либо пост-инкремент). Встраиваемом asm применяются те же ограничения, что и для ‘<’.

‘r’

Разрешен операнд регистра, если он находится в общем регистре.

‘i’

Разрешен целочисленный операнд со значением (со значением константы). Это включает символические константы, значения которых будут известны только на этапе сборки или позже.

‘n’

Разрешен целочисленный операнд со значением, известным числовым значением. Многие системы не могут поддерживать константы времени сборки для операндов, размер которых меньше слова.

‘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 различает. Например, инструкция 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-8.5.0/gcc/Simple-Constraints.html

Spec-Zone.ru

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