6.44.3.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-
Регистры ARC FPX (dpfp) 64 бит.
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
-
h-
В режиме Thumb, ядровые регистры
r8-r15. k-
Регистр указателя стека.
l-
В режиме Thumb, ядровые регистры
r0-r7. В режиме ARM это псевдоним ограниченияr. t-
Регистры плавающей запятой VFP
s0-s31. Используются для 32-битных значений. w-
Регистры плавающей запятой VFP
d0-d31и соответствующий поднаборd0-d15на основе опций командной строки. Используются только для 64-битных значений. Недействительно для Thumb1. y-
Регистры сопроцессора iWMMX.
z-
Регистры GR iWMMX.
G-
Константа плавающей запятой 0,0.
I-
Целое число, которое является допустимым непосредственным операндом в инструкции обработки данных. То есть целое число от 0 до 255, повернутое на кратное 2.
J-
Целое число от -4095 до 4095.
K-
Целое число, удовлетворяющее ограничению ‘I’ при инвертировании (дополнительный код одного).
L-
Целое число, удовлетворяющее ограничению ‘I’ при отрицании (дополнительный код двух).
M-
Целое число от 0 до 32.
Q-
Ссылка на память, где точный адрес находится в одном регистре (‘‘m’’ предпочтительнее для
asmоператоров) R-
Элемент пула констант.
S-
Символ в текстовом сегменте текущего файла.
Uv-
Ссылка на память, подходящая для инструкций загрузки/записи VFP (reg+смещение константы)
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 со смещением.
- Семейство Blackfin —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.
- Архитектура 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Константа с плавающей точкой, которая допустима для сохранения непосредственного значения
- 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.
- 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-
Константа с плавающей точкой ноль
I-
Шестибитная константа со знаком.
J-
Десятибитная константа со знаком.
L-
Шестнадцатибитная константа со знаком.
M-
Шестнадцатибитная константа без знака.
N-
Двенадцатибитная константа со знаком, отрицательная (от -2048 до -1).
O-
Константа ноль.
P-
Двенадцатибитная константа со знаком, положительная (от 1 до 2047).
- FT32—config/ft32/constraints.md
-
A-
Абсолютный адрес
B-
Смещение адреса
W-
Операнд памяти с косвенной адресацией через регистр
e-
Смещение адреса.
f-
Смещение адреса.
O-
Константа ноль или единица
I-
16-битная целая константа со знаком (-32768 … 32767)
w-
Маска битового поля, подходящая для bext или bins
x-
Инвертированная маска битового поля, подходящая для bext или bins
L-
16-битная беззнаковая константа, кратная 4 (0 … 65532)
S-
20-битная целая константа со знаком (-524288 … 524287)
b-
Константа для ширины битового поля (1 … 16)
KA-
10-битная целая константа со знаком (-512 … 511)
- 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Операнд памяти с косвенной адресацией через регистр
- Intel IA-64—config/ia64/ia64.h
-
a-
Регистр общего назначения
r0поr3для инструкцииaddl b-
Регистр ветвления
c-
Регистр предиката (‘c’ как в «условном»)
d-
Регистр приложения, находящийся в блоке М
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’, когда не используется вместе с ‘<’ или ‘>’.
- 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-
Базированные на памяти псевдорегистры $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-
Общие режимы адресации памяти для источника/назначения.
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-
Константы, которые можно напрямую использовать с логическими инструкциями.
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-
Регистр, подходящий для использования в косвенном переходе. Всегда будет
$25для -mabicalls. 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-
Операнд памяти, адрес которого формируется из базового регистра и смещения, подходящего для использования в инструкциях с тем же режимом адресации, что и
llиsc. ZDАдрес, подходящий для инструкции
prefetch, или для любой другой инструкции с тем же режимом адресации, что иprefetch.
- 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Ограничение для класса регистров низкого уровня $r0 по $r7 для ISA V3/V3M.
lКласс регистров низкого уровня $r0 по $r7.
dКласс регистров среднего уровня $r0 по $r11, $r16 по $r19.
hКласс регистров высокого уровня $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—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.
P-
Непосредственный операнд для инструкций R2 andchi/andci.
S-
Соответствует непосредственным значениям, которые являются адресами в небольшой секции данных, и, следовательно, могут быть добавлены к
gpкак 16-битный непосредственный операнд для повторного создания их 32-битного значения. U-
Соответствует константам, подходящим в качестве операнда для инструкций rdprs и cache.
v-
Операнд памяти, подходящий для инструкций эксклюзивной загрузки/хранения Nios II R2.
w-
Операнд памяти, подходящий для инструкций ввода/вывода и кеширования загрузки/хранения.
- 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-
Ссылка на память, которая закодирована в коде операции.
- 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,wo,wp,wq,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));неправильно.
Если инструкция принимает только регистры Altivec, не нужно использовать
%x<n>.asm ("xsaddqp %0,%1,%2" : "=v" (v1) : "v" (v2), "v" (v3));правильно, потому что инструкция
xsaddqpпринимает только регистры Altivec, в то время как:asm ("xsaddqp %x0,%x1,%x2" : "=v" (v1) : "v" (v2), "v" (v3));неправильно.
wb-
Регистр вектора Altivec, если используется -mcpu=power9 или NO_REGS.
wd-
Регистр вектора VSX для хранения векторизованных данных double или NO_REGS.
we-
Регистр VSX, если использовались опции -mcpu=power9 и -m64 или 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).
wo-
Регистр VSX для использования с векторными инструкциями ISA 3.0 или NO_REGS.
wp-
Регистр VSX для использования с плавающей запятой IEEE 128-бит TFmode или NO_REGS.
wq-
Регистр VSX для использования с плавающей запятой IEEE 128-бит или NO_REGS.
wr-
Регистр общего назначения, если включены 64-битные инструкции, или NO_REGS.
ws-
Регистр вектора VSX для хранения скалярных значений double или NO_REGS.
wt-
Регистр вектора VSX для хранения 128-битных целых чисел или NO_REGS.
wu-
Регистр Altivec для использования при загрузке/сохранении чисел с плавающей запятой float/32-битных целых чисел или NO_REGS.
wv-
Регистр Altivec для использования при загрузке/сохранении чисел с плавающей запятой double или NO_REGS.
ww-
Регистр FP или VSX для выполнения операций с плавающей запятой под -mvsx или NO_REGS.
wx-
Регистр с плавающей запятой, если включена инструкция STFIWX или NO_REGS.
wy-
Регистр FP или VSX для выполнения операций с плавающей запятой ISA 2.07 или NO_REGS.
wz-
Регистр с плавающей запятой, если включена инструкция LFIWZX или NO_REGS.
wA-
Базовый регистр адреса, если включены 64-битные инструкции или NO_REGS.
wD-
Целочисленная константа, являющаяся номером элемента 64-битного скаляра в векторе.
wE-
Векторная константа, которую можно загрузить с помощью инструкции XXSPLTIB.
wF-
Операнд памяти, подходящий для слияния загрузки/сохранения power9.
wG-
Операнд памяти, подходящий для слияния ссылок в TOC памяти.
wL-
Целочисленная константа, являющаяся номером элемента, на который нацелена инструкция MFVSRLD.
wM-
Соответствие векторной константе со всеми единицами, если доступна инструкция XXLORC.
wO-
Операнд памяти, подходящий для векторных инструкций ISA 3.0 в формате d.
wQ-
Адрес памяти, который будет работать с инструкциями
lqиstq. wS-
Векторная константа, которую можно загрузить с помощью XXSPLTIB и расширением знака.
h-
Регистр ‘MQ’, ‘CTR’ или ‘LINK’
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-
Точная степень двойки
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-
Запись AIX TOC
a-
Операнд адреса, являющийся индексированным или косвенным от регистра (‘p’ предпочтительнее для
asmоператоров) U-
Ссылка на небольшую область данных System V Release 4
W-
Векторная константа, не требующая памяти
j-
Векторная константа, состоящая из нулей.
- 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.Z08W16-битный регистр
R8.Z10W16-битный регистр
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 включительно.
- 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-
Операнд сдвига.
- SPARC—config/sparc/sparc.h
-
f-
Регистр с плавающей точкой на архитектуре SPARC-V8 и нижний регистр с плавающей точкой на архитектуре SPARC-V9.
e-
Регистр с плавающей точкой. Он эквивалентен ‘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-
Операнд вызова, reg, для косвенных вызовов
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 бит.
- 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-
Целочисленная константа, у которой все биты установлены в 1 и идут подряд, начиная с бита 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-элементный векторный константный, с идентичными элементами.
- Visium—config/visium/constraints.md
-
b-
Регистр EAM
mdb c-
Регистр EAM
mdc f-
Регистр с плавающей точкой
l-
Общий регистр, но не
r29,r30иr31 t-
Регистр
r1 u-
Регистр
r2 v-
Регистр
r3 G-
Константа с плавающей точкой 0.0
J-
Целочисленная константа в диапазоне 0 .. 65535 (16-битовое непосредственное значение)
K-
Целочисленная константа в диапазоне 1 .. 31 (5-битовое непосредственное значение)
L-
Целочисленная константа в диапазоне -65535 .. -1 (16-битовое отрицательное непосредственное значение)
M-
Целочисленная константа -1
O-
Целочисленная константа 0
PЦелочисленная константа 32
- x86 family—config/i386/constraints.md
-
R-
Запись наследия — восемь целочисленных регистров, доступных на всех процессорах i386 (
a,b,c,d,si,di,bp,sp). q-
Любой регистр, доступный как
rl. В 32-битном режиме —a,b,c, иd; в 64-битном режиме — любой целочисленный регистр. Q-
Любой регистр, доступный как
rh: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, так как это выделит метку либо в
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 с расширением нуля).
- 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.
- Xtensa—config/xtensa/constraints.md
-
a-
32-битный регистр общего назначения
b-
Регистр булевых значений, 1 бит
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-6.5.0/gcc/Machine-Constraints.html