6.11.3.4 Ограничения для отдельных машин
По возможности используйте буквы общих ограничений в аргументах asm, поскольку они понятнее передают смысл людям, читающим ваш код. Если это невозможно, используйте буквы ограничений, значения которых обычно очень похожи в разных архитектурах. Наиболее часто используются ограничения «m» и «r» (соответственно для памяти и регистров общего назначения; см. Простые ограничения), а также «I» — обычно буква, обозначающая наиболее распространённый формат непосредственных констант.
Каждая архитектура определяет дополнительные ограничения. Эти ограничения используются самим компилятором при генерации инструкций, а также в операторах asm; поэтому некоторые ограничения не особенно полезны для asm. Ниже приведена сводка некоторых ограничений, зависящих от машины, доступных на отдельных машинах; она включает как ограничения, полезные для asm, так и те, которые таковыми не являются. Исходный файл компилятора, указанный в заголовке таблицы для каждой архитектуры, является окончательным источником сведений о значениях ограничений этой архитектуры.
- Семейство AArch64—config/aarch64/constraints.md
-
k-
Регистр указателя стека (
SP) w-
Регистр с плавающей точкой, векторный регистр Advanced SIMD или векторный регистр SVE
x-
Как
w, но только для регистров от 0 до 15 включительно. y-
Как
w, но только для регистров от 0 до 7 включительно. Upl-
Один из восьми младших регистров-предикатов SVE (от
P0доP7) Upa-
Любой из регистров-предикатов SVE (от
P0доP15) I-
Целочисленная константа, допустимая в качестве непосредственного операнда инструкции
ADD J-
Целочисленная константа, допустимая в качестве непосредственного операнда инструкции
SUB(после изменения знака) K-
Целочисленная константа, которую можно использовать в 32-разрядной логической инструкции
L-
Целочисленная константа, которую можно использовать в 64-разрядной логической инструкции
M-
Целочисленная константа, допустимая в качестве непосредственного операнда 32-разрядной псевдоинструкции
MOV. В зависимости от значенияMOVможет быть преобразована при сборке в одну из нескольких различных машинных инструкций N-
Целочисленная константа, допустимая в качестве непосредственного операнда 64-разрядной псевдоинструкции
MOV S-
Абсолютный символьный адрес или ссылка на метку
Y-
Нулевая константа с плавающей точкой
Z-
Нулевая целочисленная константа
Ush-
Старшая часть (биты 12 и выше) адреса символа относительно счетчика команд, находящегося в пределах 4 ГБ от инструкции
Q-
Адрес памяти, использующий один базовый регистр без смещения
Ump-
Адрес памяти, подходящий для парной инструкции загрузки/сохранения в режимах SI, DI, SF и DF
- AMD GCN —config/gcn/constraints.md
-
I-
Непосредственное целое число в диапазоне от −16 до 64
J-
Непосредственное 16-разрядное целое число со знаком
Kf-
Непосредственная константа −1
L-
Непосредственное 15-разрядное целое число без знака
A-
Непосредственная константа, которую можно встроить в кодировку инструкции: целое число −16..64 или число с плавающей точкой 0.0, +/−0.5, +/−1.0, +/−2.0, +/−4.0, 1.0/(2.0*PI)
B-
Непосредственное 32-разрядное целое число со знаком, которое можно включить в кодировку инструкции
C-
Непосредственное 32-разрядное целое число в диапазоне −16..4294967295 (то есть 32-разрядное целое число без знака или ограничение ‘A’)
DA-
Непосредственная 64-разрядная константа, которую можно разделить на две константы ‘A’
DB-
Непосредственная 64-разрядная константа, которую можно разделить на две константы ‘B’
U-
Любой
unspec Y-
Любой
symbol_refилиlabel_ref v-
Регистр VGPR
a-
Регистр ускорителя VGPR (начиная с CDNA1)
Sg-
Регистр SGPR
SD-
Регистры SGPR, допустимые в качестве приемников инструкций, включая VCC, M0 и EXEC
SS-
Регистры SGPR, допустимые в качестве источников инструкций, включая VCC, M0, EXEC и SCC
Sm-
Регистры SGPR, допустимые в качестве источника инструкций скалярной памяти (исключая M0 и EXEC)
Sv-
Регистры SGPR, допустимые в качестве источника или приемника векторных инструкций (исключая EXEC)
ca-
Все регистры условий: SCC, VCCZ, EXECZ
cs-
Регистр скалярного условия: SCC
cV-
Регистр векторного условия: VCC, VCC_LO, VCC_HI
e-
Регистр EXEC (EXEC_LO и EXEC_HI)
RB-
Операнд памяти с адресным пространством, подходящим для инструкций
buffer_* RF-
Операнд памяти с адресным пространством, подходящим для инструкций
flat_* RS-
Операнд памяти с адресным пространством, подходящим для инструкций
s_* RL-
Операнд памяти с адресным пространством, подходящим для инструкций LDS
ds_* RG-
Операнд памяти с адресным пространством, подходящим для инструкций GDS
ds_* RD-
Операнд памяти с адресным пространством, подходящим для любых инструкций
ds_* RM-
Операнд памяти с адресным пространством, подходящим для инструкций
global_*
- 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
-
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-
Ссылка на память, точный адрес которой содержится в одном регистре (для инструкций
asmпредпочтительно использовать «m») 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 со смещением.
- Семейство Blackfin—config/bfin/constraints.md
-
a-
Регистр P
d-
Регистр D
z-
Регистр P, содержимое которого уничтожается при вызове функции.
qn-
Один регистр. Если n находится в диапазоне от 0 до 7, это соответствующий регистр D. Если n —
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.
- C-SKY—config/csky/constraints.md
-
a-
Мини-регистры r0 - r7.
b-
Младшие регистры r0 - r15.
c-
Регистр C.
y-
Регистры HI и LO.
l-
Регистр LO.
h-
Регистр HI.
v-
Векторные регистры.
z-
Регистр указателя стека (SP).
Q-
Адрес памяти, использующий базовый регистр с коротким смещением или индексный регистр с масштабированием.
WАдрес памяти, использующий базовый регистр и индексный регистр с масштабированием.
- 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-
Регистр класса
CR_REGS(отcc0доcc7). G-
Нулевая константа с плавающей точкой
I-
6-разрядная целочисленная константа со знаком
J-
10-разрядная целочисленная константа со знаком
L-
16-разрядная целочисленная константа со знаком
M-
16-разрядная целочисленная константа без знака
N-
12-разрядная целочисленная константа со знаком, имеющая отрицательное значение, то есть в диапазоне от −2048 до −1
O-
Нулевая константа
P-
12-разрядная целочисленная константа со знаком, имеющая положительное значение, то есть в диапазоне от 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-
Целочисленная константа, значение которой, увеличенное на единицу, является степенью двойки
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-
Регистры приложений, находящиеся в модуле M
e-
Регистры приложений, находящиеся в модуле I
f-
Регистр с плавающей точкой
m-
Операнд памяти. Если он используется вместе с ‘<’ или ‘>’, операнд может иметь постинкремент или постдекремент, для печати которых в IA-64 требуется использовать ‘%Pn’.
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.cc
-
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
- LoongArch—config/loongarch/constraints.md
-
fРегистр с плавающей точкой или векторный регистр (если доступен).
kОперанд памяти, адрес которого формируется базовым регистром и (опционально масштабируемым) индексным регистром.
lЗнаковая 16-битная константа.
mОперанд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и
st.wиld.w.IЗнаковая 12-битная константа (для арифметических инструкций).
KБеззнаковая 12-битная константа (для логических инструкций).
MКонстанта, которую нельзя загрузить с помощью
lui,addiuилиori.NКонстанта в диапазоне от -65535 до -1 включительно.
OЗнаковая 15-битная константа.
PКонстанта в диапазоне от 1 до 65535 включительно.
RАдрес, который можно использовать в немакросной инструкции загрузки или сохранения.
ZBАдрес, хранящийся в регистре общего назначения. Смещение равно нулю.
ZCОперанд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и
ll.wиsc.w.
- MicroBlaze—config/microblaze/constraints.md
-
d-
Регистр общего назначения (
r0–r31). z-
Регистр состояния (
rmsr,$fcc1–$fcc7).
- MIPS—config/mips/constraints.md
-
d-
Регистр общего назначения. Эквивалентен
r, если только не генерируется код MIPS16; в этом случае используется набор регистров 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-
Операнд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и
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, rotatert:SI от 8 до 1, представленный как поворот
O-
16 (для поворота с использованием swap)
P-
Диапазон от 8 до 15, rotatert: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Непосредственное значение, равное степени 2.
IfexНепосредственное значение, равное степени 2 минус 1.
U33Ограничение памяти для формата 333.
U45Ограничение памяти для формата 45.
U37Ограничение памяти для формата 37.
- OpenRISC—config/or1k/constraints.md
-
I-
Целое число, допустимое в качестве непосредственного операнда инструкции, принимающей знаковое 16-битное число. Диапазон от −32768 до 32767.
K-
Целое число, допустимое в качестве непосредственного операнда инструкции, принимающей беззнаковое 16-битное число. Диапазон от 0 до 65535.
M-
Знаковая 16-битная константа, сдвинутая влево на 16 бит. (Используется с
l.movhi) O-
Ноль
- PDP-11—config/pdp11/constraints.md
-
a-
Регистры с плавающей точкой AC0–AC3. Их можно загружать из памяти и сохранять в памяти одной инструкцией.
d-
Регистры общего назначения с нечётными номерами (R1, R3, R5). Они используются для 16-битных операций умножения.
D-
Ссылка на память, закодированная в коде операции, но не использующая автоинкремент или автодекремент.
f-
Любой из регистров с плавающей точкой (AC0–AC5).
G-
Константа с плавающей точкой 0.
h-
Регистры с плавающей точкой AC4 и AC5. Их нельзя загружать из памяти или сохранять в памяти одной инструкцией.
I-
Целочисленная константа, помещающаяся в 16 бит.
J-
Целочисленная константа, младшие 16 бит которой равны нулю.
K-
Целочисленная константа, не удовлетворяющая ограничениям для кодов ‘I’ или ‘J’.
L-
Целочисленная константа 1.
M-
Целочисленная константа −1.
N-
Целочисленная константа 0.
O-
Целочисленные константы от 0 до 3; сдвиги на эти величины выполняются как несколько однобитных сдвигов, а не как один сдвиг переменной длины.
Q-
Ссылка на память, для которой после кода операции требуется дополнительное слово (адрес или смещение).
R-
Ссылка на память, закодированная в коде операции.
- PowerPC and IBM RS6000—config/rs6000/constraints.md
-
r-
Регистр общего назначения (GPR),
r0…r31. b-
Базовый регистр. Подобен
r, ноr0не допускается, поэтомуr1…r31. f-
Регистр с плавающей точкой (FPR),
f0…f31. d-
Регистр с плавающей точкой. В настоящее время он совпадает с
f; историческиfиспользовался для чисел с плавающей точкой одинарной точности, аd— для чисел двойной точности. v-
Векторный регистр Altivec (VR),
v0…v31. wa-
Регистр VSX (VSR),
vs0…vs63. Это либо FPR (vs0…vs31соответствуютf0…f31), либо VR (vs32…vs63соответствуютv0…v31).При использовании
waследует использовать модификатор вывода%x, чтобы вывести правильный номер регистра. Например:asm ("xvadddp %x0,%x1,%x2" : "=wa" (v1) : "wa" (v2), "wa" (v3));Не следует использовать
%xдля операндовv:asm ("xsaddqp %0,%1,%2" : "=v" (v1) : "v" (v2), "v" (v3)); c-
Регистр счётчика,
ctr. l-
Регистр ссылки,
lr. x-
Поле 0 регистра условий,
cr0. y-
Любое поле регистра условий,
cr0…cr7. I-
Знаковая 16-битная константа.
J-
Беззнаковая 16-битная константа, сдвинутая влево на 16 бит (для констант
SImodeвместо этого используйтеL). K-
Беззнаковая 16-битная константа.
L-
Знаковая 16-битная константа, сдвинутая влево на 16 бит.
eI-
Знаковая 34-битная целочисленная константа, если поддерживаются префиксные инструкции.
eP-
Скалярная константа с плавающей точкой или векторная константа, которую можно загрузить в регистр VSX одной префиксной инструкцией.
eQ-
Константа IEEE шириной 128 бит, которую можно загрузить в регистр VSX инструкцией
lxvkq. 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));некорректно.
Q-
Операнд памяти, адресуемый только базовым регистром.
Z-
Операнд памяти с индексной или косвенной адресацией.
a-
Индексный или косвенный адрес.
- PRU—config/pru/constraints.md
-
I-
Беззнаковая 8-битная целочисленная константа.
J-
Беззнаковая 16-битная целочисленная константа.
L-
Беззнаковая 5-битная целочисленная константа (для счётчиков сдвига).
T-
Константная метка сегмента текста (памяти программы).
Z-
Целочисленная константа ноль.
- 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.
- RISC-V—config/riscv/constraints.md
-
f-
Регистр с плавающей точкой (если доступен).
I-
Знаковое 12-битное непосредственное значение типа I.
J-
Целочисленный ноль.
K-
Беззнаковое 5-битное непосредственное значение для инструкций доступа к CSR.
A-
Адрес, хранящийся в регистре общего назначения.
S-
Ограничение, соответствующее абсолютному символьному адресу.
vr-
Векторный регистр (если доступен)..
vd-
Векторный регистр, кроме v0 (если доступен).
vm-
Только векторный регистр v0 (если доступен).
cr-
Регистр общего назначения RVC (x8–x15).
cf-
Регистры с плавающей точкой RVC (f8–f15), если доступны; при использовании zfinx регистры GPR повторно используются как FPR.
R-
Пара регистров общего назначения с чётным и нечётным номерами.
- 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-разрядный глобальный регистр или регистр out для архитектуры SPARC-V8+.
C-
Константа, состоящая из единиц, для чисел с плавающей точкой.
A-
Знаковая 5-разрядная константа
D-
Векторная константа
I-
Знаковая 13-разрядная константа
J-
Ноль
K-
32-разрядная константа с обнулёнными младшими 12 битами (константа, которую можно загрузить инструкцией
sethi) L-
Константа в диапазоне, поддерживаемом инструкциями
movcc(11-разрядное знаковое непосредственное значение) M-
Константа в диапазоне, поддерживаемом инструкциями
movrcc(10-разрядное знаковое непосредственное значение) N-
То же, что «K», за исключением того, что проверяется, равны ли нулю биты, не входящие в младший 32-разрядный диапазон. Для режимов шире
SImodeнеобходимо использовать это ограничение вместо «K» O-
Константа 4096
G-
Ноль с плавающей точкой
H-
Знаковая 13-разрядная константа с расширением знака до 32 или 64 бит
P-
Константа -1
Q-
Константа с плавающей точкой, целочисленное представление которой можно переместить в целочисленный регистр одной инструкцией sethi
R-
Константа с плавающей точкой, целочисленное представление которой можно переместить в целочисленный регистр одной инструкцией mov
S-
Константа с плавающей точкой, целочисленное представление которой можно переместить в целочисленный регистр последовательностью инструкций high/lo_sum
T-
Адрес памяти, выровненный по границе 8 байт
W-
Адрес памяти для регистров с ограничением «e»
w-
Адрес памяти только с базовым регистром
Y-
Векторный ноль
- Семейство TI C6X—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).
- 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—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 это неверно, поскольку переменная 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; } U-
Целочисленные регистры, затираемые при вызове.
f-
Любой регистр стека с плавающей точкой 80387.
t-
Вершина стека с плавающей точкой 80387 (
%st(0)). u-
Второй сверху элемент стека с плавающей точкой 80387 (
%st(1)). y-
Любой регистр MMX.
x-
Любой регистр SSE.
v-
Любой регистр SSE, кодируемый в формате EVEX (
%xmm0-%xmm31). 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 с расширением знака).
We-
Знаковая 32-разрядная целочисленная константа или символьная ссылка, заведомо входящая в этот диапазон (для операций преобразования с расширением знака, которым требуются непосредственные операнды, отличные от
VOIDmode). Wz-
Беззнаковая 32-разрядная целочисленная константа или символьная ссылка, заведомо входящая в этот диапазон (для операций преобразования с расширением нулями, которым требуются непосредственные операнды, отличные от
VOIDmode). Wd-
128-разрядная целочисленная константа, у которой и старшее, и младшее 64-разрядные слова удовлетворяют ограничению
e. Ws-
Символьная ссылка или ссылка на метку. Для вывода исходного символа можно использовать модификатор
%p. Z-
Беззнаковая 32-разрядная целочисленная константа или символьная ссылка, заведомо входящая в этот диапазон (для непосредственных операндов инструкций x86-64 с расширением нулями).
Tv-
Адресный операнд VSIB.
Ts-
Адресный операнд без сегментного регистра.
- 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-
Ссылка на память, являющаяся операцией помещения значения в стек.
R-
Ссылка на память, являющаяся операцией извлечения значения из стека.
S-
Ссылка на память, указывающая на константный адрес с известным значением.
T-
Регистр, указанный Rx (пока не реализовано).
U-
Константа, не входящая в диапазон от 2 до 15 включительно.
Z-
Константа 0.
- 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-15.3.0/gcc/Machine-Constraints.html