Spec-Zone.ru › GCC 14

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

Spec-Zone.ru

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