Spec-Zone.ru › GCC 13

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

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

пробелы

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

‘m’

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

‘o’

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

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

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

‘V’

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

‘<’

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

‘>’

Разрешен операнд памяти с адресацией автоинкремента (либо предварительный инкремент, либо постинкеремент). В строке inline 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-13.3.0/gcc/Simple-Constraints.html

Spec-Zone.ru

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