6.42.4 Ограничения для конкретных машин
В тех случаях, когда это возможно, следует использовать общие буквенные обозначения ограничений в аргументах asm, поскольку они лучше передают смысл читателям вашего кода. В противном случае используйте буквенные обозначения ограничений, которые, как правило, имеют очень похожие значения в разных архитектурах. Наиболее часто используемые ограничения — ‘m’ и ‘r’ (соответственно для регистров памяти и общих регистров; см. Простые ограничения), а также ‘I’, обычно обозначающая наиболее распространенный формат непосредственных констант.
Каждая архитектура определяет дополнительные ограничения. Эти ограничения используются самим компилятором для генерации инструкций, а также для asm операторов; поэтому некоторые ограничения не особенно полезны для asm. Вот сводка некоторых зависящих от машины ограничений, доступных на некоторых конкретных машинах; она включает как ограничения, полезные для asm , так и ограничения, которыми не являются. Исходный файл компилятора, упомянутый в заголовке таблицы для каждой архитектуры, является окончательным справочником по значениям ограничений данной архитектуры.
- Семейство AArch64—
config/aarch64/constraints.md -
k- Регистр указателя стека (
SP) w- Регистр плавающей точки или регистр векторной SIMD
I- Целочисленная константа, допустимая в качестве непосредственного операнда в инструкции
ADD J- Целочисленная константа, допустимая в качестве непосредственного операнда в инструкции
SUB(после инвертирования знака) K- Целочисленная константа, которая может использоваться с 32-битной логической инструкцией
L- Целочисленная константа, которая может использоваться с 64-битной логической инструкцией
M- Целочисленная константа, допустимая в качестве непосредственного операнда в 32-битной
MOVпсевдоинструкции.MOVможет быть собрана в одну из нескольких различных машинных инструкций в зависимости от значения N- Целочисленная константа, допустимая в качестве непосредственного операнда в 64-битной
MOVпсевдоинструкции S- Абсолютный символический адрес или ссылка на метку
Y- Константа плавающей точки ноль
Z- Целочисленная константа ноль
Ush- Высшая часть (биты 12 и выше) pc-относительного адреса символа в пределах 4 ГБ от инструкции
Q- Адрес памяти, использующий один базовый регистр без смещения
Ump- Адрес памяти, подходящий для инструкции пары загрузки/сохранения в режимах SI, DI, SF и DF
- ARC —
config/arc/constraints.md -
q- Регистры, используемые в 16-битных инструкциях ARCompact:
r0-r3,r12-r15. Это ограничение может сопоставиться только при включенном параметре-mq. e- Регистры, пригодные в качестве базовых регистров адресов памяти в 16-битных инструкциях памяти ARCompact:
r0-r3,r12-r15,sp. Это ограничение может сопоставиться только при включенном параметре-mq. D- 64-битные регистры ARC FPX (dpfp).
D0,D1. I- Целочисленная константа со знаком длиной 12 бит.
Cal- Константа для арифметических/логических операций. Это может быть любая константа, которую ассемблер или компоновщик может поместить в длинную константу без использования перераспределения PIC.
K- Целочисленная константа без знака длиной 3 бита.
L- Целочисленная константа без знака длиной 6 бит.
CnL- Дополнительный код к целочисленной константе без знака длиной 6 бит.
CmL- Дополнительный код к целочисленной константе без знака длиной 6 бит (дополнение до двух).
M- Целочисленная константа без знака длиной 5 бит.
O- Целочисленная константа без знака длиной 7 бит.
P- Целочисленная константа без знака длиной 8 бит.
H- Любое значение const_double.
- Семейство ARM—
config/arm/constraints.md -
w- Регистр плавающей точки VFP
G- Константа плавающей точки 0,0
I- Целое число, допустимое в качестве непосредственного операнда в инструкции обработки данных. То есть целое число в диапазоне от 0 до 255, повернутое на кратное 2 число позиций
J- Целое число в диапазоне от -4095 до 4095
K- Целое число, удовлетворяющее ограничению ‘
I’ при инвертировании (дополнение до единицы) L- Целое число, удовлетворяющее ограничению ‘
I’ при отрицании (дополнение до двух) M- Целое число в диапазоне от 0 до 32
Q- Ссылка на память, где точный адрес находится в одном регистре (`‘
m’' предпочтительнее дляasmоператоров) R- Элемент пула констант
S- Символ в текстовом сегменте текущего файла
Uv- Ссылка на память, подходящая для инструкций загрузки/хранения VFP (регистр + смещение константы)
Uy- Ссылка на память, подходящая для инструкций загрузки/хранения iWMMXt.
Uq- Ссылка на память, подходящая для инструкции ARMv4 ldrsb.
- Семейство AVR—
config/avr/constraints.md -
l- Регистры от r0 до r15
a- Регистры от r16 до r23
d- Регистры от r16 до r31
w- Регистры от r24 до r31. Эти регистры могут использоваться в команде ‘
adiw’ e- Регистр указателя (r26–r31)
b- Базовый регистр указателя (r28–r31)
q- Регистр указателя стека (SPH:SPL)
t- Временный регистр r0
x- Регистровая пара X (r27:r26)
y- Регистровая пара Y (r29:r28)
z- Регистровая пара Z (r31:r30)
I- Константа со знаком, большая чем −1 и меньшая чем 64
J- Константа со знаком, большая чем −64 и меньшая чем 1
K- Целочисленная константа 2
L- Целочисленная константа 0
M- Константа, которая помещается в 8 бит
N- Целочисленная константа −1
O- Целочисленная константа 8, 16 или 24
P- Целочисленная константа 1
G- Константа плавающей точки 0,0
Q- Адрес памяти, основанный на указателях Y или Z со смещением.
- Epiphany—
config/epiphany/constraints.md -
U16- Беззнаковая 16-битная константа.
K- Беззнаковая 5-битная константа.
L- Константа со знаком длиной 11 бит.
Cm1- Константа со знаком длиной 11 бит, к которой добавлено −1. Может сопоставляться только при активном параметре -m1reg-reg.
Cl1- Левый сдвиг −1, то есть маска бита с блоком старших единиц, остальные — блок младших нулей. Может сопоставляться только при активном параметре -m1reg-reg.
Cr1- Правый сдвиг −1, то есть маска бита с конечным блоком единиц, остальные — нули. Или, другими словами, значение, на единицу меньшее, чем степень двойки. Может сопоставляться только при активном параметре -m1reg-reg.
Cal- Константа для арифметических/логических операций. Это похоже на
i, за исключением того, что для кода, независимого от позиции, не допускаются символы/выражения, требующие перераспределения. Csy- Символьная константа для инструкции вызова/перехода.
Rcs- Класс регистров, пригодных для использования в коротких инструкциях. Это ограничение класса регистров, и оно может управлять выделением регистров. Это ограничение не будет сопоставляться, если
-mprefer-short-insn-regsне активен. Rsc- Класс регистров регистров, которые могут хранить адрес вызова sibcall.
Rct- Класс регистров управления ядром.
Rgs- Группа регистров, пригодная для использования в коротких инструкциях. Это ограничение не использует класс регистров, поэтому оно только пассивно сопоставляет подходящие регистры и не управляет выделением регистров.
Rra- Соответствует возвращаемому адресу, если его можно заменить регистром ссылки.
Rcc- Соответствует целочисленному регистру кода условия.
Sra- Соответствует возвращаемому адресу, если он находится в слоте стека.
Cfm- Соответствует значениям регистров управления для переключения режима FP, которые инкапсулированы в
UNSPEC_FP_MODE.
- Архитектура CR16—
config/cr16/cr16.h -
b- Регистры от r0 до r14 (без регистра указателя стека)
t- Регистр от r0 до r11 (все 16-битные регистры)
p- Регистр от r12 до r15 (все 32-битные регистры)
I- Целочисленная константа со знаком, помещающаяся в 4 бита
J- Целочисленная константа со знаком, помещающаяся в 5 бит
K- Целочисленная константа со знаком, помещающаяся в 6 бит
L- Целочисленная константа без знака, помещающаяся в 4 бита
M- Целочисленная константа со знаком, помещающаяся в 32 бита
N- Проверка констант шириной 64 бита для инструкций сложения/вычитания
G- Константа плавающей точки, допустимая для инструкции сохранения непосредственного значения
- Hewlett-Packard PA-RISC—
config/pa/pa.h
-
a- Регистр общего назначения 1
f- Регистр с плавающей точкой
q- Регистр смещения
x- Регистр с плавающей точкой (устаревший)
y- Регистр с плавающей точкой (32-битный), регистр с плавающей точкой (64-битный)
Z- Любой регистр
I- Целочисленная константа со знаком длиной 11 бит
J- Целочисленная константа со знаком длиной 14 бит
K- Целочисленная константа, которая может быть помещена с помощью инструкции
zdepi L- Целочисленная константа со знаком длиной 5 бит
M- Целочисленная константа 0
N- Целочисленная константа, которая может быть загружена с помощью инструкции
ldil O- Целочисленная константа, значение которой плюс один является степенью 2
P- Целочисленная константа, которая может использоваться для операций
andв инструкцияхdepiиextru S- Целочисленная константа 31
U- Целочисленная константа 63
G- Константа с плавающей точкой 0.0
A- Операнд памяти таблицы связей данных
lo_sum Q- Операнд памяти, который может использоваться в качестве целевого операнда инструкции целочисленной записи
R- Операнд памяти с индексом, масштабируемый или нет
T- Операнд памяти для загрузки и сохранения чисел с плавающей точкой
W- Операнд памяти с косвенной адресацией по регистру
- Семейство picoChip—
picochip.h -
k- Регистр стека.
f- Регистр указателя. Регистр, который может использоваться для доступа к памяти без указания смещения. Любой другой регистр может использоваться для доступа к памяти, но потребует постоянного смещения. В случае, если смещение равно нулю, использование регистра указателя более эффективно, так как это уменьшает размер кода.
t- Двойной регистр. Регистр, который может быть сопряжён с соседним регистром для создания 32-битного регистра.
a- Любой абсолютный адрес памяти (например, символьная константа, символьная константа + смещение).
I- Целочисленная константа со знаком длиной 4 бита.
J- Целочисленная константа без знака длиной 4 бита.
K- Целочисленная константа со знаком длиной 8 бит.
M- Любая константа, абсолютное значение которой не превышает 4 бит.
N- Целочисленная константа со знаком длиной 10 бит
O- Целочисленная константа со знаком длиной 16 бит.
- PowerPC и IBM RS6000—
config/rs6000/constraints.md -
b- Базовый регистр адреса
d- Регистр с плавающей точкой (содержащий 64-битовое значение)
f- Регистр с плавающей точкой (содержащий 32-битовое значение)
v- Векторный регистр Altivec
wa- Любой регистр VSX, если использовалась опция -mvsx или NO_REGS.
При использовании ограничений регистров (
wa,wd,wf,wg,wh,wi,wj,wk,wl,wm,ws,wt,wu,wv,ww, илиwy), которые принимают регистры VSX, необходимо использовать%x<n>в шаблоне, чтобы правильно использовать регистр. В противном случае номер регистра в файле ассемблера будет неверным, если регистр Altivec является операндом инструкции VSX, которая ожидает нумерацию регистров VSX.asm ("xvadddp %x0,%x1,%x2" : "=wa" (v1) : "wa" (v2), "wa" (v3));верно, но:
asm ("xvadddp %0,%1,%2" : "=wa" (v1) : "wa" (v2), "wa" (v3));неверно.
wd- Векторный регистр VSX для хранения данных двойной точности вектора или NO_REGS.
wf- Векторный регистр VSX для хранения данных с плавающей точкой (float) вектора или NO_REGS.
wg- Если использовалась
-mmfpgpr, регистр с плавающей точкой или NO_REGS. wh- Регистр с плавающей точкой, если доступны прямые перемещения, или NO_REGS.
wi- Регистр FP или VSX для хранения 64-битных целых чисел для инструкций VSX или NO_REGS.
wj- Регистр FP или VSX для хранения 64-битных целых чисел для прямых перемещений или NO_REGS.
wk- Регистр FP или VSX для хранения 64-битных чисел с двойной точностью для прямых перемещений или NO_REGS.
wl- Регистр с плавающей точкой, если включена инструкция LFIWAX, или NO_REGS.
wm- Регистр VSX, если включены инструкции прямого перемещения, или NO_REGS.
wn- Нет регистра (NO_REGS).
wr- Регистр общего назначения, если включены 64-битные инструкции, или NO_REGS.
ws- Векторный регистр VSX для хранения скалярных значений с двойной точностью или NO_REGS.
wt- Векторный регистр VSX для хранения 128-битного целого числа или NO_REGS.
wu- Регистр Altivec для использования при загрузке/сохранении чисел с плавающей точкой (float) или 32-битных целых чисел или NO_REGS.
wv- Регистр Altivec для использования при загрузке/сохранении чисел с двойной точностью или NO_REGS.
ww- Регистр FP или VSX для выполнения операций с плавающей точкой в
-mvsxили NO_REGS. wx- Регистр с плавающей точкой, если включена инструкция STFIWX, или NO_REGS.
wy- Регистр FP или VSX для выполнения операций с плавающей точкой ISA 2.07 или NO_REGS.
wz- Регистр с плавающей точкой, если включена инструкция LFIWZX, или NO_REGS.
wD- Целочисленная константа, являющаяся номером элемента 64-битного скаляра в векторе.
wQ- Адрес памяти, который будет работать с инструкциями
lqиstq. h- Регистр ‘
MQ’, ‘CTR’ или ‘LINK’ q- Регистр ‘
MQ’ c- Регистр ‘
CTR’ l- Регистр ‘
LINK’ x- Регистр ‘
CR’ (регистр условий) номер 0 y- Регистр ‘
CR’ (регистр условий) z- Флаг переноса ‘
XER[CA]’ (часть регистра XER) I- Целочисленная константа со знаком длиной 16 бит
J- Целочисленная константа без знака длиной 16 бит, сдвинутая влево на 16 бит (используйте ‘
L’ вместоSImodeконстант) K- Целочисленная константа без знака длиной 16 бит
L- Целочисленная константа со знаком длиной 16 бит, сдвинутая влево на 16 бит
M- Константа больше 31
N- Точная степень 2
O- Ноль
P- Константа, отрицание которой является 16-битной константой со знаком
G- Константа с плавающей точкой, которая может быть загружена в регистр одной инструкцией на слово
H- Целочисленная/число с плавающей точкой константа, которая может быть загружена в регистр с помощью трех инструкций
m- Операнд памяти. Обычно
mне допускает адресов, обновляющих базовый регистр. Если также используется ограничение ‘<’ или ‘>’, они разрешены, и поэтому на платформах PowerPC в этом случае безопасно использовать ‘m<>’ в оператореasm, если этот операторasmобращается к операнду ровно один раз. Операторasmтакже должен использовать ‘%U<opno>’ в качестве замены для флага «обновления» в соответствующей инструкции загрузки или сохранения. Например:asm ("st%U0 %1,%0" : "=m<>" (mem) : "r" (val));верно, но:
asm ("st %1,%0" : "=m<>" (mem) : "r" (val));неверно.
es- «Стабильный» операнд памяти; т. е. операнд, который не включает никакого автоматического изменения базового регистра. Это было полезно, когда ‘
m’ допускал автоматическое изменение базового регистра, но поскольку сейчас это допускается только при использовании ‘<’ или ‘>’, ‘es’ по сути такое же, как ‘m’ без ‘<’ и ‘>’. Q- Операнд памяти, представляющий собой смещение от регистра (лучше использовать ‘
m’ или ‘es’ в операторахasm). Z- Операнд памяти, представляющий собой индекс или косвенную ссылку от регистра (лучше использовать ‘
m’ или ‘es’ в операторахasm). R- Запись TOC AIX
a- Операнд адреса, представляющий собой индекс или косвенную ссылку от регистра (‘
p’ предпочтительнее для операторовasm). S- Константа, подходящая в качестве операнда маски длиной 64 бита
T- Константа, подходящая в качестве операнда маски длиной 32 бита
U- Ссылка на небольшую область данных System V Release 4
t- Маски AND, которые могут быть выполнены двумя инструкциями rldic{l, r}
W- Векторная константа, которая не требует памяти
j- Векторная константа, все элементы которой равны нулю.
- Intel 386—
config/i386/constraints.md
-
R- Регистр устаревшего типа — восемь целочисленных регистров, доступных на всех процессорах i386 (
a,b,c,d,si,di,bp,sp). q- Любой регистр, доступный как r
l. В 32-битном режиме,a,b,c, иd; в 64-битном режиме, любой целочисленный регистр. Q- Любой регистр, доступный как r
h:a,b,c, иd. a- Регистр
a. b- Регистр
b. c- Регистр
c. d- Регистр
d. S- Регистр
si. D- Регистр
di. A- Регистры
aиd. Этот класс используется для инструкций, которые возвращают результаты двойной длины в паре регистровax:dx. Односложные значения будут распределены либо вax, либо вdx. Например, на i386 следующее реализуетrdtsc:unsigned long long rdtsc (void) { unsigned long long tick; __asm__ __volatile__("rdtsc":"=A"(tick)); return tick; }.Это неверно для x86_64, так как будет выделять tick либо в
ax, либо вdx. Вместо этого нужно использовать следующий вариант:unsigned long long rdtsc (void) { unsigned int tickl, tickh; __asm__ __volatile__("rdtsc":"=a"(tickl),"=d"(tickh)); return ((unsigned long long)tickh << 32)|tickl; } f- Любой регистр с плавающей точкой 80387 (стек).
t- Вершина стека регистров с плавающей точкой 80387 (
%st(0)). u- Второй сверху регистр стека регистров с плавающей точкой 80387 (
%st(1)). y- Любой регистр MMX.
x- Любой регистр SSE.
Yz- Первый регистр SSE (
%xmm0). I- Целочисленная константа в диапазоне 0 ... 31 для сдвигов в 32-битном режиме.
J- Целочисленная константа в диапазоне 0 ... 63 для сдвигов в 64-битном режиме.
K- Целочисленная константа со знаком 8 бит.
L-
0xFFили0xFFFF, для andsi как сдвига с нулевым расширением. M- 0, 1, 2 или 3 (сдвиги для инструкции
lea). N- Целочисленная константа без знака 8 бит (для инструкций
inиout). G- Стандартная константа с плавающей точкой 80387.
C- Операнд SSE, постоянный ноль.
e- 32-битная целочисленная константа со знаком или символическая ссылка, известная тем, что она подходит для этого диапазона (для непосредственных операндов в инструкциях x86-64 с расширением знака).
Z- 32-битная целочисленная константа без знака или символическая ссылка, известная тем, что она подходит для этого диапазона (для непосредственных операндов в инструкциях x86-64 с нулевым расширением).
- Intel IA-64—
config/ia64/ia64.h -
a- Общий регистр
r0доr3для инструкцииaddl b- Регистр ветвления
c- Регистр предиката («
c», как в «условный») d- Прикладной регистр, расположенный в блоке M
e- Прикладной регистр, расположенный в блоке I
f- Регистр с плавающей точкой
m- Операнд памяти. Если используется вместе с «
<» или «>», операнд может иметь пост-инкремент и пост-декремент, что требует вывода с «%Pn» на IA-64. G- Константа с плавающей точкой 0.0 или 1.0
I- Целочисленная константа со знаком 14 бит
J- Целочисленная константа со знаком 22 бит
K- Целочисленная константа со знаком 8 бит для логических инструкций
L- Целочисленная константа со знаком 8 бит, скорректированная для псевдоопераций сравнения
M- Целочисленная константа без знака 6 бит для счётов сдвига
N- Целочисленная константа со знаком 9 бит для пост-инкрементов загрузки и сохранения
O- Константа ноль
P- 0 или −1 для инструкции
dep Q- Неизменяемая память для загрузки и сохранения с плавающей точкой
R- Целочисленная константа в диапазоне от 1 до 4 для инструкции
shladd S- Операнд памяти, за исключением пост-инкремента и пост-декремента. Сейчас это примерно то же, что и «
m», когда не используется вместе с «<» или «>».
- FRV—
config/frv/frv.h -
a- Регистр класса
ACC_REGS(acc0доacc7). b- Регистр класса
EVEN_ACC_REGS(acc0доacc7). c- Регистр класса
CC_REGS(fcc0доfcc3иicc0доicc3). d- Регистр класса
GPR_REGS(gr0доgr63). e- Регистр класса
EVEN_REGS(gr0доgr63). Нечётные регистры исключены не из класса, а через использование машинного режима больше 4 байтов. f- Регистр класса
FPR_REGS(fr0доfr63). h- Регистр класса
FEVEN_REGS(fr0доfr63). Нечётные регистры исключены не из класса, а через использование машинного режима больше 4 байтов. l- Регистр класса
LR_REG(регистрlr). q- Регистр класса
QUAD_REGS(gr2доgr63). Регистры с номерами, не кратными 4, исключаются не из класса, а через использование машинного режима больше 8 байтов. t- Регистр класса
ICC_REGS(icc0доicc3). u- Регистр класса
FCC_REGS(fcc0доfcc3). v- Регистр класса
ICR_REGS(cc4доcc7). w- Регистр класса
FCR_REGS(cc0доcc3). x- Регистр класса
QUAD_FPR_REGS(fr0доfr63). Регистры с номерами, не кратными 4, исключаются не из класса, а через использование машинного режима больше 8 байтов. z- Регистр класса
SPR_REGS(lcrиlr). A- Регистр класса
QUAD_ACC_REGS(acc0доacc7). B- Регистр класса
ACCG_REGS(accg0доaccg7). C- Регистр класса
CR_REGS(cc0доcc7). G- Константа с плавающей точкой, ноль
I- Целочисленная константа со знаком 6 бит
J- Целочисленная константа со знаком 10 бит
L- Целочисленная константа со знаком 16 бит
M- Целочисленная константа без знака 16 бит
N- Целочисленная константа со знаком 12 бит, отрицательная — т.е. в диапазоне от −2048 до −1
O- Константа ноль
P- Целочисленная константа со знаком 12 бит, больше нуля — т.е. в диапазоне от 1 до 2047.
- Blackfin family—
config/bfin/constraints.md
-
a- Регистр P
d- Регистр D
z- Вызов функции изменил регистр P.
-
qn - Один регистр. Если n находится в диапазоне от 0 до 7, то соответствующий регистр D. Если это
A, то регистр P0. D- Регистр D с чётным номером
W- Регистр D с нечётным номером
e- Регистр аккумулятора.
A- Регистр аккумулятора с чётным номером.
B- Регистр аккумулятора с нечётным номером.
b- Регистр I
v- Регистр B
f- Регистр M
c- Регистры, используемые для циклического буферизации, т.е. регистры I, B или L.
C- Регистр CC.
t- LT0 или LT1.
k- LC0 или LC1.
u- LB0 или LB1.
x- Любой регистр D, P, B, M, I или L.
y- Дополнительные регистры, обычно используемые только в прологах и эпилогах: RETS, RETN, RETI, RETX, RETE, ASTAT, SEQSTAT и USP.
w- Любой регистр, кроме аккумуляторов или CC.
Ksh- Целое число со знаком 16 бит (в диапазоне от −32768 до 32767)
Kuh- Целое число без знака 16 бит (в диапазоне от 0 до 65535)
Ks7- Целое число со знаком 7 бит (в диапазоне от −64 до 63)
Ku7- Целое число без знака 7 бит (в диапазоне от 0 до 127)
Ku5- Целое число без знака 5 бит (в диапазоне от 0 до 31)
Ks4- Целое число со знаком 4 бит (в диапазоне от −8 до 7)
Ks3- Целое число со знаком 3 бит (в диапазоне от −3 до 4)
Ku3- Целое число без знака 3 бит (в диапазоне от 0 до 7)
-
Pn - Константа n, где n — однозначная константа в диапазоне от 0 до 4.
PA- Целое число, равное одной из констант MACFLAG_XXX, подходящая для использования с любым аккумулятором.
PB- Целое число, равное одной из констант MACFLAG_XXX, подходящая только для использования с аккумулятором A1.
M1- Константа 255.
M2- Константа 65535.
J- Целая константа с ровно одним установленным битом.
L- Целая константа со всеми установленными битами, кроме ровно одного.
-
HQ - Любая SYMBOL_REF.
- M32C—
config/m32c/m32c.c -
-
RspRfbRsb - ‘
$sp’, ‘$fb’, ‘$sb’. Rcr- Любой регистр управления, когда он имеет ширину 16 бит (ничего, если регистры управления имеют ширину 24 бита)
Rcl- Любой регистр управления, когда он имеет ширину 24 бита.
-
R0wR1wR2wR3w - $r0, $r1, $r2, $r3.
R02- $r0 или $r2, или $r2r0 для 32-битовых значений.
R13- $r1 или $r3, или $r3r1 для 32-битовых значений.
Rdi- Регистр, который может хранить 64-битовое значение.
Rhl- $r0 или $r1 (регистры с адресуемыми байтами высокого/низкого порядка)
R23- $r2 или $r3
Raa- Регистры адреса.
Raw- Регистры адреса, когда они имеют ширину 16 бит.
Ral- Регистры адреса, когда они имеют ширину 24 бита.
Rqi- Регистры, которые могут хранить значения QI.
Rad- Регистры, которые могут использоваться со смещениями ($a0, $a1, $sb).
Rsi- Регистры, которые могут хранить 32-битовые значения.
Rhi- Регистры, которые могут хранить 16-битовые значения.
Rhc- Регистры, которые могут хранить 16-битовые значения, включая все регистры управления.
Rra- $r0 до R1, плюс $a0 и $a1.
Rfl- Регистр флагов.
Rmm- Регистры памяти pseudo-регистры $mem0 до $mem15.
Rpi- Регистры, которые могут хранить указатели (16-битные регистры для r8c, m16c; 24-битные регистры для m32cm, m32c).
Rpa- Сопоставляет несколько регистров в PARALLEL, чтобы сформировать больший регистр. Используется для сопоставления значений возврата функций.
Is3- −8 ... 7
IS1- −128 ... 127
IS2- −32768 ... 32767
IU2- 0 ... 65535
In4- −8 ... −1 или 1 ... 8
In5- −16 ... −1 или 1 ... 16
In6- −32 ... −1 или 1 ... 32
IM2- −65536 ... −1
Ilb- 8-битовое значение с ровно одним установленным битом.
Ilw- 16-битовое значение с ровно одним установленным битом.
Sd- Общие режимы адресации памяти src/dest.
Sa- Память, адресуемая с помощью $a0 или $a1.
Si- Память, адресуемая с немедленным адресом.
Ss- Память, адресуемая с помощью указателя стека ($sp).
Sf- Память, адресуемая с помощью регистра базы фрейма ($fb).
Ss- Память, адресуемая с помощью регистра малой базы ($sb).
S1- $r1h
-
- MeP—
config/mep/constraints.md -
a- Регистр $sp.
b- Регистр $tp.
c- Любой регистр управления.
d- Либо регистр $hi, либо регистр $lo.
em- Регистры сопроцессора, которые могут быть загружены напрямую ($c0-$c15).
ex- Регистры сопроцессора, которые могут быть перемещены друг в друга.
er- Регистры сопроцессора, которые могут быть перемещены в регистры ядра.
h- Регистр $hi.
j- Регистр $rpc.
l- Регистр $lo.
t- Регистры, которые могут использоваться в адресации, относительной к $tp.
v- Регистр $gp.
x- Регистры сопроцессора.
y- Регистры управления сопроцессора.
z- Регистр $0.
A- Набор регистров пользователя A.
B- Набор регистров пользователя B.
C- Набор регистров пользователя C.
D- Набор регистров пользователя D.
I- Смещения для адресации, относительной к $gp.
J- Константы, которые могут быть использованы напрямую с инструкциями boolean.
K- Константы, которые могут быть напрямую загружены в регистры.
L- Небольшие константы, которые могут быть добавлены к регистрам.
M- Длинные сдвиги.
N- Небольшие константы, которые могут быть сравнены с регистрами.
O- Константы, которые могут быть загружены в верхнюю половину регистров.
S- Непосредственные значения со знаком 8 бит.
T- Символы, закодированные для адресации, относительной к $tp или $gp.
U- Адреса, не являющиеся константами, для загрузки/сохранения регистров сопроцессора.
W- Верхняя половина значения символа.
Y- Адрес с косвенной адресацией без смещения.
Z- Символические ссылки на шину управления.
- MicroBlaze—
config/microblaze/constraints.md -
d- Общий регистр (
r0доr31). z- Регистр состояния (
rmsr,$fcc1до$fcc7).
- MIPS—
config/mips/constraints.md
-
d- Регистр адреса. Эквивалентен
rза исключением генерации кода MIPS16. f- Регистр с плавающей точкой (если доступен).
h- Раньше регистр
hi. Это ограничение больше не поддерживается. l- Регистр
lo. Используйте этот регистр для хранения значений, не превышающих размер слова. x- Объединённые регистры
hiиlo. Используйте этот регистр для хранения значений двойного слова. c- Регистр, подходящий для использования в косвенном переходе. Для
-mabicallsвсегда будет$25. v- Регистр
$3. Не используйте это ограничение в новом коде; оно сохраняется только для совместимости с glibc. y- Эквивалентно
r; сохраняется для обратной совместимости. z- Регистр кода условия для чисел с плавающей точкой.
I- Целое число со знаком 16-бит (для арифметических инструкций).
J- Целое ноль.
K- Целое число без знака 16-бит (для логических инструкций).
L- Целое число со знаком 32-бит, в котором младшие 16 битов равны нулю. Такие константы могут быть загружены с помощью
lui. M- Константа, которую нельзя загрузить с помощью
lui,addiuилиori. N- Константа в диапазоне от −65535 до −1 (включительно).
O- Целое число со знаком 15-бит.
P- Константа в диапазоне от 1 до 65535 (включительно).
G- Ноль с плавающей точкой.
R- Адрес, который можно использовать в не-макрокомандной загрузке или сохранении.
ZC- При компиляции кода microMIPS это ограничение соответствует операнду памяти, адрес которого формируется из базового регистра и 12-битного смещения. Эти операнды могут использоваться для инструкций microMIPS, таких как
llиsc. При компиляции не для кода microMIPS,ZCэквивалентноR. ZD- При компиляции кода microMIPS это ограничение соответствует операнду адреса, который формируется из базового регистра и 12-битного смещения. Эти операнды могут использоваться для инструкций microMIPS, таких как
prefetch. При компиляции не для кода microMIPS,ZDэквивалентноp.
- Motorola 680x0—
config/m68k/constraints.md -
a- Регистр адреса
d- Регистр данных
f- Регистр 68881 с плавающей точкой, если доступен
I- Целое число в диапазоне от 1 до 8
J- 16-битное целое число со знаком
K- Число со знаком, модуль которого больше 0x80
L- Целое число со знаком в диапазоне от −8 до −1
M- Число со знаком, модуль которого больше 0x100
N- Диапазон от 24 до 31, вращение:SI от 8 до 1, представленное как вращение
O- 16 (для вращения с использованием swap)
P- Диапазон от 8 до 15, вращение:HI от 8 до 1, представленное как вращение
R- Числа, которые может обработать mov3q
G- Константа с плавающей точкой, которая не является константой 68881
S- Операнды, удовлетворяющие 'm', когда -mpcrel активен
T- Операнды, удовлетворяющие 's', когда -mpcrel неактивен
Q- Косвенный режим адресации регистра
U- Адресация с регистровым смещением
W- const_call_operand
Cs- symbol_ref или const
Ci- const_int
C0- const_int 0
Cj- Диапазон целых чисел со знаком, которые не помещаются в 16 бит
Cmvq- Целые числа, допустимые для mvq
Capsw- Целые числа, допустимые для moveq, за которым следует swap
Cmvz- Целые числа, допустимые для mvz
Cmvs- Целые числа, допустимые для mvs
Ap- push_operand
Ac- Операнды, не являющиеся регистрами, разрешённые в clr
- Moxie—
config/moxie/constraints.md -
A- Абсолютный адрес
B- Смещённый адрес
W- Операнд памяти с косвенной адресацией регистра
I- Константа в диапазоне от 0 до 255.
N- Константа в диапазоне от 0 до −255.
- MSP430–
config/msp430/constraints.md -
R12- Регистр R12.
R13- Регистр R13.
K- Целая константа 1.
L- Целая константа от -1^20 до 1^19.
M- Целая константа от 1 до 4.
Ya- Ссылок на память, которые не требуют расширенной инструкции MOVX.
Yl- Ссылка на память, только метки.
Ys- Ссылка на память, только стек.
- NDS32—
config/nds32/constraints.md -
w- Ограничение класса регистров LOW $r0 до $r7 для ISA V3/V3M.
l- Класс регистров LOW $r0 до $r7.
d- Класс регистров MIDDLE $r0 до $r11, $r16 до $r19.
h- Класс регистров HIGH $r12 до $r14, $r20 до $r31.
t- Вспомогательный регистр $ta (т.е. $r15).
k- Регистр стека $sp.
Iu03- Целое без знака 3-битное значение.
In03- Отрицательное 3-битное значение со знаком в диапазоне от −7 до 0.
Iu04- Целое без знака 4-битное значение.
Is05- Целое со знаком 5-битное значение.
Iu05- Целое без знака 5-битное значение.
In05- Отрицательное 5-битное значение со знаком в диапазоне от −31 до 0.
Ip05- Целое без знака 5-битное значение для инструкции movpi45 с диапазоном от 16 до 47.
Iu06- Ограничение целого без знака 6-битного значения для инструкции addri36.sp.
Iu08- Целое без знака 8-битное значение.
Iu09- Целое без знака 9-битное значение.
Is10- Целое со знаком 10-битное значение.
Is11- Целое со знаком 11-битное значение.
Is15- Целое со знаком 15-битное значение.
Iu15- Целое без знака 15-битное значение.
Ic15- Константа, которая не находится в диапазоне imm15u, но подходит для инструкции bclr.
Ie15- Константа, которая не находится в диапазоне imm15u, но подходит для инструкции bset.
It15- Константа, которая не находится в диапазоне imm15u, но подходит для инструкции btgl.
Ii15- Константа, обратное значение которой находится в диапазоне imm15u и подходит для инструкции bitci.
Is16- Целое со знаком 16-битное значение.
Is17- Целое со знаком 17-битное значение.
Is19- Целое со знаком 19-битное значение.
Is20- Целое со знаком 20-битное значение.
Ihig- Непосредственное значение, которое может быть просто установлено с высокими 20 битами.
Izeb- Непосредственное значение 0xff.
Izeh- Непосредственное значение 0xffff.
Ixls- Непосредственное значение 0x01.
Ix11- Непосредственное значение 0x7ff.
Ibms- Непосредственное значение со степенью двойки.
Ifex- Непосредственное значение со степенью двойки минус 1.
U33- Ограничение памяти для формата 333.
U45- Ограничение памяти для формата 45.
U37- Ограничение памяти для формата 37.
- Nios II family—
config/nios2/constraints.md -
I- Целое число, допустимое в качестве непосредственного операнда в инструкции, принимающей 16-битное число со знаком. Диапазон от −32768 до 32767.
J- Целое число, допустимое в качестве непосредственного операнда в инструкции, принимающей 16-битное число без знака. Диапазон от 0 до 65535.
K- Целое число, допустимое в качестве непосредственного операнда в инструкции, принимающей только старшие 16 битов 32-битного числа. Диапазон 32-битных чисел с младшими 16 битами, равными 0.
L- Целое число, допустимое в качестве непосредственного операнда для инструкции сдвига. Диапазон от 0 до 31.
M- Целое число, допустимое в качестве непосредственного операнда только для значения 0. Может использоваться совместно с модификатором формата
zдля использованияr0вместо0в выходном коде ассемблера. N- Целое число, допустимое в качестве непосредственного операнда для пользовательского кода операции. Диапазон от 0 до 255.
S- Соответствует непосредственным значениям, являющимся адресами в небольшой секции данных и, следовательно, может быть добавлен к
gpкак 16-битное непосредственное значение для пересоздания их 32-битного значения.
- PDP-11—
config/pdp11/constraints.md
-
a- Регистры с плавающей точкой AC0 по AC3. Их можно загружать из памяти и сохранять в неё одной инструкцией.
d- Регистры общего назначения с нечётными номерами (R1, R3, R5). Они используются для операций умножения на 16 бит.
f- Любой из регистров с плавающей точкой (AC0 по AC5).
G- Константа с плавающей точкой 0.
I- Целая константа, помещающаяся в 16 бит.
J- Целая константа, младшие 16 биты которой равны нулю.
K- Целая константа, не удовлетворяющая ограничениям для кодов ‘
I’ или ‘J’. L- Целая константа 1.
M- Целая константа −1.
N- Целая константа 0.
O- Целые константы от −4 до −1 и от 1 до 4; сдвиги на эти величины обрабатываются как несколько сдвигов на один бит, а не как один сдвиг переменной длины.
Q- Ссылка на ячейку памяти, требующая дополнительного слова (адреса или смещения) после кода операции.
R- Ссылка на ячейку памяти, закодированная в коде операции.
- RL78—
config/rl78/constraints.md -
Int3- Целая константа в диапазоне от 1 ... 7.
Int8- Целая константа в диапазоне от 0 ... 255.
J- Целая константа в диапазоне от −255 ... 0
K- Целая константа 1.
L- Целая константа -1.
M- Целая константа 0.
N- Целая константа 2.
O- Целая константа -2.
P- Целая константа в диапазоне от 1 ... 15.
Qbi- Встроенные типы сравнения — eq, ne, gtu, ltu, geu и leu.
Qsc- Синтетические типы сравнения — gt, lt, ge и le.
Wab- Ссылка на ячейку памяти по абсолютному адресу.
Wbc- Ссылка на ячейку памяти с использованием
BCв качестве базового регистра с необязательным смещением. Wca- Ссылка на ячейку памяти с использованием
AX,BC,DE, илиHLдля адреса при вызовах. Wcv- Ссылка на ячейку памяти с использованием любой 16-битной пары регистров для адреса при вызовах.
Wd2- Ссылка на ячейку памяти с использованием
DEв качестве базового регистра с необязательным смещением. Wde- Ссылка на ячейку памяти с использованием
DEв качестве базового регистра без смещения. Wfr- Любая ссылка на ячейку памяти по адресу в дальнем адресном пространстве.
Wh1- Ссылка на ячейку памяти с использованием
HLв качестве базового регистра с необязательным однобайтовым смещением. Whb- Ссылка на ячейку памяти с использованием
HLв качестве базового регистра, сBилиCв качестве индексного регистра. Whl- Ссылка на ячейку памяти с использованием
HLв качестве базового регистра без смещения. Ws1- Ссылка на ячейку памяти с использованием
SPв качестве базового регистра с необязательным однобайтовым смещением. Y- Любая ссылка на ячейку памяти по адресу в ближнем адресном пространстве.
A- Регистр
AX. B- Регистр
BC. D- Регистр
DE. R- Регистры от
AдоL. S- Регистр
SP. T- Регистр
HL. Z08W- 16-битный регистр
R8. Z10W- 16-битный регистр
R10. Zint- Регистры, зарезервированные для прерываний (от
R24доR31). a- Регистр
A. b- Регистр
B. c- Регистр
C. d- Регистр
D. e- Регистр
E. h- Регистр
H. l- Регистр
L. v- Виртуальные регистры.
w- Регистр
PSW. x- Регистр
X.
- RX—
config/rx/constraints.md -
Q- Адрес, не использующий косвенную адресацию по регистру или адресацию с пред/после-инкрементом/декрементом.
Symbol- Ссылка на символ.
Int08- Константа в диапазоне от −256 до 255 включительно.
Sint08- Константа в диапазоне от −128 до 127 включительно.
Sint16- Константа в диапазоне от −32768 до 32767 включительно.
Sint24- Константа в диапазоне от −8388608 до 8388607 включительно.
Uint04- Константа в диапазоне от 0 до 15 включительно.
- SPARC—
config/sparc/sparc.h -
f- Регистр с плавающей точкой на архитектуре SPARC-V8 и регистр с плавающей точкой более низкого порядка на архитектуре SPARC-V9.
f- Регистр с плавающей точкой. Он эквивалентен ‘
f’ на архитектуре SPARC-V8 и содержит регистры с плавающей точкой более низкого и более высокого порядка на архитектуре SPARC-V9. c- Регистр кодов условий для плавающей точки.
d- Регистр с плавающей точкой более низкого порядка. Он имеет значение только на архитектуре SPARC-V9, когда доступен набор инструкций Visual Instruction Set.
b- Регистр с плавающей точкой. Он имеет значение только на архитектуре SPARC-V9, когда доступен набор инструкций Visual Instruction Set.
h- 64-битный глобальный или выходной регистр для архитектуры SPARC-V8+.
C- Константа всех единиц для плавающей точки.
A- Целая константа со знаком 5 бит.
D- Векторная константа.
I- Целая константа со знаком 13 бит.
J- Ноль.
K- 32-битная константа с младшими 12 битами, равными нулю (константа, которая может быть загружена с помощью инструкции
sethi). L- Константа в диапазоне, поддерживаемом инструкциями
movcc(11-битный знаковый непосредственный операнд). M- Константа в диапазоне, поддерживаемом инструкциями
movrcc(10-битный знаковый непосредственный операнд). N- То же, что и ‘
K’, за исключением проверки того, что биты, не входящие в диапазон младших 32 бит, равны нулю. Должно использоваться вместо ‘K’ для режимов, более широких, чемSImode. O- Константа 4096.
G- Плавающая точка ноль.
H- Целая константа со знаком 13 бит, со знаком, расширенным до 32 или 64 бит.
P- Константа -1.
Q- Константа с плавающей точкой, целочисленное представление которой может быть помещено в целочисленный регистр с помощью одной инструкции sethi.
R- Константа с плавающей точкой, целочисленное представление которой может быть помещено в целочисленный регистр с помощью одной инструкции mov.
S- Константа с плавающей точкой, целочисленное представление которой может быть помещено в целочисленный регистр с помощью последовательности инструкций high/lo_sum.
T- Адрес памяти, выровненный по границе 8 байт.
U- Чётный регистр.
W- Адрес памяти для регистров с ограничением ‘
e’. w- Адрес памяти только с базовым регистром.
Y- Векторный ноль.
- SPU—
config/spu/spu.h
-
a- Непосредственное значение, которое можно загрузить с помощью инструкций il/ila/ilh/ilhu. const_int обрабатывается как 64-битовое значение.
c- Непосредственное значение для инструкций and/xor/or. const_int обрабатывается как 64-битовое значение.
d- Непосредственное значение для инструкции
iohl. const_int обрабатывается как 64-битовое значение. f- Непосредственное значение, которое можно загрузить с помощью
fsmbi. A- Непосредственное значение, которое можно загрузить с помощью инструкций il/ila/ilh/ilhu. const_int обрабатывается как 32-битовое значение.
B- Непосредственное значение для большинства арифметических инструкций. const_int обрабатывается как 32-битовое значение.
C- Непосредственное значение для инструкций and/xor/or. const_int обрабатывается как 32-битовое значение.
D- Непосредственное значение для инструкции
iohl. const_int обрабатывается как 32-битовое значение. I- Константа в диапазоне [−64, 63] для инструкций сдвига/вращения.
J- Беззнаковая 7-битовая константа для инструкций преобразования/nop/каналов.
K- Знаковая 10-битовая константа для большинства арифметических инструкций.
M- Знаковая 16-битная непосредственная константа для
stop. N- Беззнаковая 16-битная константа для
iohlиfsmbi. O- Беззнаковая 7-битовая константа, три младших бита которой равны 0.
P- Беззнаковая 3-битовая константа для 16-байтовых вращений и сдвигов
R- Операнд вызова, регистр, для косвенных вызовов
S- Операнд вызова, символ, для относительных вызовов.
T- Операнд вызова, const_int, для абсолютных вызовов.
U- Непосредственное значение, которое можно загрузить с помощью инструкций il/ila/ilh/ilhu. const_int расширяется со знаком до 128 бит.
W- Непосредственное значение для инструкций сдвига и вращения. const_int обрабатывается как 32-битовое значение.
Y- Непосредственное значение для инструкций and/xor/or. const_int расширяется со знаком до 128 бит.
Z- Непосредственное значение для инструкции
iohl. const_int расширяется со знаком до 128 бит.
- S/390 and zSeries—
config/s390/s390.h -
a- Регистр адреса (общего назначения, за исключением r0)
c- Регистр кода условия
d- Регистр данных (любой регистр общего назначения)
f- Регистр с плавающей запятой
I- Беззнаковая 8-битная константа (0–255)
J- Беззнаковая 12-битная константа (0–4095)
K- Знаковая 16-битная константа (−32768–32767)
L- Значение, подходящее в качестве смещения.
(0..4095)- для короткого смещения
(−524288..524287)- для длинного смещения
M- Целочисленная константа со значением 0x7fffffff.
N- Ограничение из нескольких букв, за которым следуют 4 буквенных параметра.
0..9:- номер части, считая с самой старшей до младшей значащей
H,Q:- режим части
D,S,H:- режим содержащего операнда
0,F:- значение других частей (F—все биты установлены)
Q- Ссылка на память без регистра индекса и с коротким смещением.
R- Ссылка на память с регистром индекса и коротким смещением.
S- Ссылка на память без регистра индекса, но с длинным смещением.
T- Ссылка на память с регистром индекса и длинным смещением.
U- Указатель с коротким смещением.
W- Указатель с длинным смещением.
Y- Операнд счетчика сдвига.
- Score family—
config/score/score.h -
d- Регистры от r0 до r32.
e- Регистры от r0 до r16.
t- Регистры r8—r11 или r22—r27.
h- Регистр hi.
l- Регистр lo.
x- Регистр hi + lo.
q- Регистр cnt.
y- Регистр lcb.
z- Регистр scb.
a- Регистр cnt + lcb + scb.
c- Регистр cr0—cr15.
b- Регистры cp1.
f- Регистры cp2.
i- Регистры cp3.
j- Регистры cp1 + cp2 + cp3.
I- Высшая 16-битная константа (32-битная константа с 16 младшими битами нулями).
J- Беззнаковое 5-битовое целое число (в диапазоне от 0 до 31).
K- Беззнаковое 16-битовое целое число (в диапазоне от 0 до 65535).
L- Знаковое 16-битовое целое число (в диапазоне от −32768 до 32767).
M- Беззнаковое 14-битовое целое число (в диапазоне от 0 до 16383).
N- Знаковое 14-битовое целое число (в диапазоне от −8192 до 8191).
Z- Любой SYMBOL_REF.
- Xstormy16—
config/stormy16/stormy16.h -
a- Регистр r0.
b- Регистр r1.
c- Регистр r2.
d- Регистр r8.
e- Регистры r0 по r7.
t- Регистры r0 и r1.
y- Регистр переноса.
z- Регистры r8 и r9.
I- Константа в диапазоне от 0 до 3 включительно.
J- Константа, в которой установлен ровно один бит.
K- Константа, в которой сброшен ровно один бит.
L- Константа в диапазоне от 0 до 255 включительно.
M- Константа в диапазоне от −255 до 0 включительно.
N- Константа в диапазоне от −3 до 0 включительно.
O- Константа в диапазоне от 1 до 4 включительно.
P- Константа в диапазоне от −4 до −1 включительно.
Q- Ссылка на память, являющаяся стековым push.
R- Ссылка на память, являющаяся стековым pop.
S- Ссылка на память, ссылающаяся на константу адреса с известным значением.
T- Регистр, указанный Rx (ещё не реализован).
U- Константа, не находящаяся в диапазоне от 2 до 15 включительно.
Z- Константа 0.
- TI C6X family—
config/c6x/constraints.md -
a- Файл регистров A (A0–A31).
b- Файл регистров B (B0–B31).
A- Регистры-предикаты в файле регистров A (A0–A2 на C64X и выше, иначе A1 и A2).
B- Регистры-предикаты в файле регистров B (B0–B2).
C- Регистр, используемый при вызове, в файле регистров B (B0–B9, B16–B31).
Da- Файл регистров A, за исключением регистров-предикатов (A3–A31, плюс A0, если не C64X или выше).
Db- Файл регистров B, за исключением регистров-предикатов (B3–B31).
Iu4- Целочисленная константа в диапазоне 0 ... 15.
Iu5- Целочисленная константа в диапазоне 0 ... 31.
In5- Целочисленная константа в диапазоне −31 ... 0.
Is5- Целочисленная константа в диапазоне −16 ... 15.
I5x- Целочисленная константа, которая может быть операндом инструкции ADDA или SUBA.
IuB- Целочисленная константа в диапазоне 0 ... 65535.
IsB- Целочисленная константа в диапазоне −32768 ... 32767.
IsC- Целочисленная константа в диапазоне -2^20 ... 2^20 - 1.
Jc- Целочисленная константа, являющаяся допустимой маской для инструкции clr.
Js- Целочисленная константа, являющаяся допустимой маской для инструкции set.
Q- Местоположение памяти с базовым регистром A.
R- Местоположение памяти с базовым регистром B.
Z- Регистр B14 (также известен как DP).
- TILE-Gx—
config/tilegx/constraints.md
-
-
R00R01R02R03R04R05R06R07R08R09R10 - Каждый из них представляет ограничение регистра для отдельного регистра, от r0 до r10.
I- Целочисленная константа со знаком, 8-битовая.
J- Целочисленная константа со знаком, 16-битовая.
K- Целочисленная константа без знака, 16-битовая.
L- Целочисленная константа, помещающаяся в один байт со знаком при увеличении на единицу (−129 ... 126).
m- Операнд памяти. Если используется вместе с ‘
<’ или ‘>’, операнд может иметь пост-инкремент, что требует печати с ‘%In’ и ‘%in’ на TILE-Gx. Например:asm ("st_add %I0,%1,%i0" : "=m<>" (*mem) : "r" (val)); M- Маска битов, подходящая для инструкции BFINS.
N- Целочисленная константа, представляющая собой байт, разложенный восемь раз.
O- Целочисленная константа ноль.
P- Целочисленная константа, являющаяся байтом со знаком, разложенным как два слова.
Q- Целочисленная константа, помещающаяся в один байт со знаком при увеличении (−129 ... 126), но без -1.
S- Целочисленная константа, имеющая все биты подряд, начиная с бита 0.
T- 16-битный фрагмент ссылки got, tls или pc-относительной.
U- Операнд памяти без пост-инкремента. Это примерно то же, что ‘
m’, если не используется вместе с ‘<’ или ‘>’. W- 8-элементный векторный константа с одинаковыми элементами.
Y- 4-элементный векторный константа с одинаковыми элементами.
Z0- Целочисленная константа 0xffffffff.
Z1- Целочисленная константа 0xffffffff00000000.
-
- TILEPro—
config/tilepro/constraints.md -
-
R00R01R02R03R04R05R06R07R08R09R10 - Каждый из них представляет ограничение регистра для отдельного регистра, от r0 до r10.
I- Целочисленная константа со знаком, 8-битовая.
J- Целочисленная константа со знаком, 16-битовая.
K- Целочисленная константа отличная от нуля с нулевыми 16 младшими битами.
L- Целочисленная константа, помещающаяся в один байт со знаком при увеличении на единицу (−129 ... 126).
m- Операнд памяти. Если используется вместе с ‘
<’ или ‘>’, операнд может иметь пост-инкремент, что требует печати с ‘%In’ и ‘%in’ на TILEPro. Например:asm ("swadd %I0,%1,%i0" : "=m<>" (mem) : "r" (val)); M- Маска битов, подходящая для инструкции MM.
N- Целочисленная константа, представляющая собой байт, разложенный четыре раза.
O- Целочисленная константа ноль.
P- Целочисленная константа, являющаяся байтом со знаком, разложенным как два слова.
Q- Целочисленная константа, помещающаяся в один байт со знаком при увеличении (−129 ... 126), но без -1.
T- Символический операнд или 16-битный фрагмент ссылки got, tls или pc-относительной.
U- Операнд памяти без пост-инкремента. Это примерно то же, что ‘
m’, если не используется вместе с ‘<’ или ‘>’. W- 4-элементный векторный константа с одинаковыми элементами.
Y- 2-элементный векторный константа с одинаковыми элементами.
-
- Xtensa—
config/xtensa/constraints.md -
a- 32-битный регистр общего назначения
b- Однобитный регистр булевых значений
A- 40-битный регистр аккумулятора MAC16
I- 12-битная целочисленная константа со знаком для использования в инструкциях MOVI
J- 8-битная целочисленная константа со знаком для использования в инструкциях ADDI
K- Целочисленная константа, допустимая для инструкций BccI
L- Целочисленная константа без знака, допустимая для инструкций BccUI
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Machine-Constraints.html