Spec-Zone.ru › GCC 4

6.42.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’
Разрешается операнд, являющийся допустимым адресом памяти. Это для инструкций «load address» и «push address».

‘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-4.9.4/gcc/Simple-Constraints.html

Spec-Zone.ru

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