6.45.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псевдоинструкции. Псевдоинструкция может быть ассемблирована в одну из нескольких различных машинных инструкций в зависимости от значения N-
Целочисленная константа, допустимая в качестве непосредственного операнда в 64-битной
MOVпсевдоинструкции S-
Абсолютный символический адрес или ссылка на метку
Y-
Константа с плавающей точкой ноль
Z-
Целочисленная константа ноль
Ush-
Высокая часть (биты 12 и выше) pc-относительного адреса символа в пределах 4 ГБ от инструкции
Q-
Адрес памяти, использующий один базовый регистр без смещения
Ump-
Адрес памяти, подходящий для инструкции загрузки/сохранения пары в режимах SI, DI, SF и DF
- ARC —config/arc/constraints.md
-
q-
Регистры, используемые в 16-битных инструкциях ARCompact:
r0-r3,r12-r15. Данное ограничение может быть применено только при использовании опции -mq. eРегистры, используемые в качестве базовых регистров адресов памяти в 16-битных инструкциях памяти ARCompact:
r0-r3,r12-r15,sp. Данное ограничение может быть применено только при использовании опции -mq.D-
64-битные регистры ARC FPX (dpfp).
D0,D1. I-
Целочисленная константа со знаком размером 12 бит.
Cal-
Константа для арифметических/логических операций. Это может быть любая константа, которую ассемблер или компоновщик может поместить в длинный непосредственный операнд без привлечения перемещения PIC.
K-
Целочисленная константа без знака размером 3 бита.
L-
Целочисленная константа без знака размером 6 бит.
CnL-
Однодополнительный код целочисленной константы без знака размером 6 бит.
CmL-
Двудополнительный код целочисленной константы без знака размером 6 бит.
M-
Целочисленная константа без знака размером 5 бит.
O-
Целочисленная константа без знака размером 7 бит.
P-
Целочисленная константа без знака размером 8 бит.
HЛюбое значение const_double.
- ARM семейство—config/arm/constraints.md
-
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-
Регистры iWMMX GR.
G-
Константа с плавающей точкой 0,0
I-
Целое число, допустимое в качестве непосредственного операнда в инструкции обработки данных. То есть целое число в диапазоне от 0 до 255, повернутое на кратное 2 число разрядов
J-
Целое число в диапазоне от -4095 до 4095
K-
Целое число, которое удовлетворяет ограничению «I» при инвертировании (однодополнительный код)
L-
Целое число, которое удовлетворяет ограничению «I» при отрицании (двудополнительный код)
M-
Целое число в диапазоне от 0 до 32
Q-
Ссылка на память, где точный адрес находится в единственном регистре (‘‘m’’ предпочтительнее для
asmутверждений) R-
Элемент константного пула
S-
Символ в сегменте текста текущего файла
Uv-
Ссылка на память, подходящая для инструкций загрузки/сохранения VFP (регистр + постоянное смещение)
Uy-
Ссылка на память, подходящая для инструкций загрузки/сохранения iWMMXt.
UqСсылка на память, подходящая для инструкции ARMv4 ldrsb.
- AVR семейство—config/avr/constraints.md
-
l-
Регистры от r0 до r15
a-
Регистры от r16 до r23
d-
Регистры от r16 до r31
w-
Регистры от r24 до r31. Эти регистры могут быть использованы в команде ‘adiw’
e-
Регистр указателя (r26–r31)
b-
Регистр указателя базы (r28–r31)
q-
Регистр указателя стека (SPH:SPL)
t-
Временный регистр r0
x-
Регистровая пара X (r27:r26)
y-
Регистровая пара Y (r29:r28)
z-
Регистровая пара Z (r31:r30)
I-
Константа больше -1, меньше 64
J-
Константа больше -64, меньше 1
K-
Константа 2
L-
Константа 0
M-
Константа, помещающаяся в 8 бит
N-
Константа -1
O-
Константа 8, 16 или 24
P-
Константа 1
G-
Константа с плавающей точкой 0,0
QАдрес памяти, основанный на указателе Y или Z со смещением.
- 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Константа с плавающей точкой, допустимая для инструкции store immediate
- 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-
Целая константа, значение которой плюс один — степень двойки
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-
Общие режимы адресации памяти src/dest.
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-
Регистр, подходящий для использования в косвенном переходе. Всегда будет
$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, rotatert:SI 8 до 1 выражается как rotate
O-
16 (для rotate с использованием swap)
P-
Диапазон от 8 до 15, rotatert:HI 8 до 1 выражается как rotate
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-
Целочисленная константа -120..119.
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 исключительной загрузки/хранения.
w-
Операнд памяти, подходящий для инструкций загрузки/хранения ввода/вывода и инструкций кэширования.
- PDP-11—config/pdp11/constraints.md
-
a-
Регистры с плавающей точкой AC0–AC3. Их можно загрузить из/в память одной инструкцией.
d-
Общие регистры с нечётными номерами (R1, R3, R5). Используются для операций умножения на 16 бит.
f-
Любой из регистров с плавающей точкой (AC0–AC5).
G-
Константа с плавающей точкой 0.
I-
Целочисленная константа, которая помещается в 16 бит.
J-
Целочисленная константа, младшие 16 битов которой равны 0.
K-
Целочисленная константа, которая не удовлетворяет ограничениям для кодов ‘I’ или ‘J’.
L-
Целочисленная константа 1.
M-
Целочисленная константа -1.
N-
Целочисленная константа 0.
O-
Целочисленные константы от -4 до -1 и от 1 до 4; сдвиги на эти величины обрабатываются как несколько однобитовых сдвигов, а не как один сдвиг переменной длины.
Q-
Ссылка на память, которая требует дополнительного слова (адреса или смещения) после кода операции.
R-
Ссылка на память, закодированная в коде операции.
- PowerPC and 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-битовых чисел double для прямых перемещений или NO_REGS.
wl-
Регистр с плавающей запятой, если включена инструкция LFIWAX или NO_REGS.
wm-
Регистр VSX, если включены инструкции прямых перемещений, или NO_REGS.
wn-
Никакой регистр (NO_REGS).
wo-
Регистр VSX для использования с векторными инструкциями ISA 3.0 или NO_REGS.
wp-
Регистр VSX для использования с 128-битными плавающей запятой IEEE в режиме TF или NO_REGS.
wq-
Регистр VSX для использования с 128-битными плавающей запятой IEEE или 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.
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-
Операнд памяти, подходящий для векторных инструкций 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-
Запись 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-
12-битная непосредственная величина без знака для инструкций доступа к 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, когда доступен набор визуальных инструкций.
b-
Регистр с плавающей точкой. Действителен только на архитектуре SPARC-V9, когда доступен набор визуальных инструкций.
h-
64-битный глобальный или выходной регистр для архитектуры SPARC-V8+.
C-
Константа, состоящая из единиц (для чисел с плавающей точкой).
A-
5-битная константа со знаком.
D-
Векторная константа.
I-
13-битная константа со знаком.
J-
Ноль.
K-
32-битная константа с обнуленными младшими 12 битами (константа, которая может быть загружена с помощью инструкции
sethi) L-
Константа в диапазоне, поддерживаемом инструкциями
movcc(11-битная непосредственная величина со знаком). M-
Константа в диапазоне, поддерживаемом инструкциями
movrcc(10-битная непосредственная величина со знаком). movrcc-
Та же, что и ‘K’, за исключением того, что проверяет, что биты, которые не находятся в диапазоне младших 32-бит, все равны нулю. Должна использоваться вместо ‘K’ для режимов, более широких, чем
SImode. N-
Константа 4096.
SImode-
Ноль с плавающей точкой.
O-
13-битная константа со знаком, расширенная со знаком до 32 или 64 бит.
G-
Константа -1.
H-
Константа с плавающей точкой, целая часть которой может быть перемещена в регистр целых чисел с помощью одной инструкции sethi.
P-
Константа с плавающей точкой, целая часть которой может быть перемещена в регистр целых чисел с помощью одной инструкции mov.
Q-
Константа с плавающей точкой, целая часть которой может быть перемещена в регистр целых чисел с помощью последовательности инструкций high/lo_sum.
R-
Адрес памяти, выровненный по границе 8 байт.
S-
Чётный регистр.
T-
Адрес памяти для регистров ограничения ‘e’.
U-
Адрес памяти только с базовым регистром.
W-
Векторный ноль.
- SPU—config/spu/spu.h
-
a-
Непосредственное значение, которое может быть загружено с помощью инструкций il/ila/ilh/ilhu. const_int обрабатывается как 64-битовое значение.
c-
Непосредственное значение для инструкций and/xor/or. const_int обрабатывается как 64-битовое значение.
d-
Непосредственное значение для инструкции
iohl. const_int обрабатывается как 64-битовое значение. f-
Непосредственное значение, которое может быть загружено с помощью
fsmbi. A-
Непосредственное значение, которое может быть загружено с помощью инструкций il/ila/ilh/ilhu. const_int обрабатывается как 32-битовое значение.
B-
Непосредственное значение для большинства арифметических инструкций. const_int обрабатывается как 32-битовое значение.
C-
Непосредственное значение для инструкций and/xor/or. const_int обрабатывается как 32-битовое значение.
D-
Непосредственное значение для инструкции
iohl. const_int обрабатывается как 32-битовое значение. I-
Константа в диапазоне [-64, 63] для инструкций сдвига/вращения.
J-
Беззнаковая 7-битовая константа для инструкций преобразования/nop/каналов.
K-
Знаковая 10-битовая константа для большинства арифметических инструкций.
M-
Знаковая 16-битовая непосредственная константа для
stop. N-
Беззнаковая 16-битовая константа для
iohlиfsmbi. O-
Беззнаковая 7-битовая константа, три младших бита которой равны 0.
P-
Беззнаковая 3-битовая константа для 16-байтовых вращений и сдвигов
R-
Операнд вызова, регистр, для косвенных вызовов
S-
Операнд вызова, символ, для относительных вызовов.
T-
Операнд вызова, const_int, для абсолютных вызовов.
U-
Непосредственное значение, которое может быть загружено с помощью инструкций il/ila/ilh/ilhu. const_int расширяется со знаком до 128 бит.
W-
Непосредственное значение для инструкций сдвига и вращения. const_int обрабатывается как 32-битовое значение.
Y-
Непосредственное значение для инструкций and/xor/or. const_int расширяется со знаком до 128 бит.
Z-
Непосредственное значение для инструкции
iohl. const_int расширяется со знаком до 128 бит.
- 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 или ссылки по относительному смещению.
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 или ссылки по относительному смещению.
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 следующее реализует %%%CODE_BLOCK_920%%:unsigned long long rdtsc (void) { unsigned long long tick; __asm__ __volatile__("rdtsc":"=A"(tick)); return tick; }Это неверно на x86-64, так как это приведет к выделению tick либо в
ax, либо вdx. Следует использовать следующий вариант вместо него:unsigned long long rdtsc (void) { unsigned int tickl, tickh; __asm__ __volatile__("rdtsc":"=a"(tickl),"=d"(tickh)); return ((unsigned long long)tickh << 32)|tickl; } f-
Любой регистр 80387 с плавающей точкой (стековый).
t-
Вершина стека 80387 с плавающей точкой (
%st(0)). u-
Второй сверху регистр стека 80387 с плавающей точкой (
%st(1)). y-
Любой регистр MMX.
x-
Любой регистр SSE.
Yz-
Первый регистр SSE (
%xmm0). I-
Целочисленная константа в диапазоне от 0 до 31 для 32-битных сдвигов.
J-
Целочисленная константа в диапазоне от 0 до 63 для 64-битных сдвигов.
K-
Целочисленная константа со знаком 8 бит.
L-
0xFFили0xFFFF, для andsi как перемещения с нулевым расширением. M-
0, 1, 2 или 3 (сдвиги для инструкции
lea). N-
Целочисленная константа без знака 8 бит (для инструкций
inиout). G-
Стандартная константа с плавающей точкой 80387.
C-
Операнд константы SSE, равный нулю.
e-
Целочисленная константа со знаком 32 бит или символическая ссылка, известная как входящая в этот диапазон (для непосредственных операндов в инструкциях x86-64 с расширением знака).
Z-
Целочисленная константа без знака 32 бит или символическая ссылка, известная как входящая в этот диапазон (для непосредственных операндов в инструкциях x86-64 с нулевым расширением).
- 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-
Однобитный регистр булевых значений
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-7.5.0/gcc/Machine-Constraints.html