Spec-Zone.ru › GCC 11

Далее: Ограничения с несколькими альтернативами, Выше: Ограничения для asm операндов [Содержание][Индекс]

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’ ¶

Разрешён операнд целого числа, значение которого не является явным целым числом.

Это может показаться странным; если инструкция позволяет использовать операнд со значением, неизвестным на этапе компиляции, она определённо должна разрешать любое известное значение. Так почему же использовать ‘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 как обозначающие регистры данных, адресов и с плавающей точкой.

Далее: Ограничения с несколькими альтернативами, Выше: Ограничения для asm операндов [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/Simple-Constraints.html

Spec-Zone.ru

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