6.45.3.4 Ограничения для конкретных машин
В случае возможности следует использовать общие символы ограничений в аргументах asm, так как они более наглядно передадут смысл читателям вашего кода. В противном случае используйте символы ограничений, которые, как правило, имеют очень похожие значения в разных архитектурах. Наиболее часто используемыми ограничениями являются ‘m’ и ‘r’ (соответственно для памяти и общих регистров; см. Простые ограничения), и ‘I’, обычно обозначающий наиболее распространённый формат непосредственных констант.
Каждая архитектура определяет дополнительные ограничения. Эти ограничения используются самим компилятором для генерации инструкций, а также для asm заявлений; поэтому некоторые из ограничений не особенно полезны для asm. Вот сводка некоторых машинозависимых ограничений, доступных на некоторых конкретных машинах; она включает как ограничения, полезные для asm, так и ограничения, которыми не являются. Файл исходного кода компилятора, упомянутый в заголовке таблицы для каждой архитектуры, является окончательным справочником для значений ограничений данной архитектуры.
- Семейство AArch64—config/aarch64/constraints.md
-
k-
Регистр указателя стека (
SP) w-
Регистр с плавающей запятой, регистр вектора расширенного SIMD или регистр вектора SVE
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 и выше) 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’, при отрицании (дополнительный код 2).
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 бита для инструкций add/sub
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-
Символьная константа для инструкции call/jump.
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-
Целочисленная константа, значение которой плюс один является степенью 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-
Регистр приложения, находящийся в блоке 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’, когда не используется вместе с ‘<’ или ‘>’.
- 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
- 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, циклический сдвиг: SI от 8 до 1, представленный как сдвиг
O-
16 (для циклического сдвига с использованием обмена)
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.
P-
Непосредственный операнд для инструкций R2 andchi/andci.
S-
Соответствует непосредственным значениям, которые являются адресами в небольшой секции данных и, следовательно, могут быть добавлены к
gpкак 16-битное непосредственное значение для повторного создания их 32-битного значения. U-
Соответствует константам, подходящим в качестве операнда для инструкций rdprs и cache.
v-
Операнд памяти, подходящий для инструкций Nios II R2 load/store exclusive.
w-
Операнд памяти, подходящий для инструкций load/store IO и cache.
- 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 вектора для хранения данных двойной точности вектора или NO_REGS.
we-
Регистр VSX, если были использованы параметры -mcpu=power9 и -m64 или NO_REGS.
wf-
Регистр VSX вектора для хранения данных с плавающей точкой одинарной точности или 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 бит в режиме TF или NO_REGS.
wq-
Регистр VSX для использования с плавающей точкой IEEE 128 бит или 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.
wA-
Базовый регистр адреса, если включены 64-битовые инструкции, или NO_REGS.
wB-
Целое число со знаком, 5-битовый константный операнд, который можно загрузить в регистр Altivec.
wD-
Целочисленный константный операнд, являющийся номером элемента 64-битового скаляра в векторе.
wE-
Векторный константный операнд, который можно загрузить с помощью инструкции XXSPLTIB.
wF-
Операнд памяти, подходящий для инструкций загрузки/хранения слияния Power9.
wG-
Операнд памяти, подходящий для слияния ссылок памяти TOC.
wH-
Регистр Altivec, если используется -mvsx-small-integer.
wI-
Регистр с плавающей точкой, если используется -mvsx-small-integer.
wJ-
Регистр FP, если используются -mvsx-small-integer и -mpower9-vector.
wK-
Регистр Altivec, если используются -mvsx-small-integer и -mpower9-vector.
wL-
Целочисленная константа, представляющая собой номер элемента, который обрабатывает инструкция MFVSRLD.
wM-
Векторный константный операнд, состоящий из единиц, если доступна инструкция XXLORC.
wO-
Операнд памяти, подходящий для векторных инструкций d-формата ISA 3.0.
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-
Запись TOC AIX
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.
- RISC-V—config/riscv/constraints.md
-
f-
Регистр с плавающей запятой (если доступен).
I-
Целочисленное беззнаковое 12-битное смещение.
J-
Целое число ноль.
K-
5-битное беззнаковое смещение для инструкций доступа к CSR.
A-
Адрес, хранящийся в общем регистре.
- 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 бит, 3 младших бита которой равны 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; } 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. Z-
32-битная целочисленная константа без знака или символическая ссылка, известная как подходящая для этого диапазона (для непосредственных операндов в инструкциях x86-64 с нулевым расширением).
Tv-
Операнд адреса VSIB.
Ts-
Операнд адреса без регистра сегмента.
Ti-
Операнд адреса MPX без индекса.
Tb-
Операнд адреса MPX без базы.
- 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-
Регистр-аккумулятор MAC16 40-разрядный
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-8.5.0/gcc/Machine-Constraints.html