6.47.3.4 Ограничения для конкретных машин
По возможности, следует использовать общие буквы ограничений в asm аргументах, так как они будут лучше передавать смысл людям, читающим ваш код. В противном случае используйте буквы ограничений, которые обычно имеют очень схожее значение в разных архитектурах. Наиболее часто используемые ограничения — ‘m’ и ‘r’ (для памяти и общих регистров соответственно; см. Простые ограничения), и ‘I’, обычно обозначающая наиболее распространённый формат непосредственной константы.
Каждая архитектура определяет дополнительные ограничения. Эти ограничения используются самим компилятором для генерации инструкций, а также для asm операторов; поэтому некоторые ограничения не особенно полезны для asm. Вот сводка некоторых машинозависимых ограничений, доступных на некоторых конкретных машинах; она включает как ограничения, полезные для asm, так и ограничения, которые таковыми не являются. Исходный файл компилятора, упомянутый в заголовке таблицы для каждой архитектуры, является окончательным справочником значений ограничений этой архитектуры.
- AArch64 family—config/aarch64/constraints.md
-
k-
Регистр указателя стека (
SP) w-
Регистр плавающей точки, регистр вектора расширенной SIMD или регистр вектора SVE
x-
Как
w, но ограничено регистрами с 0 по 15 включительно. y-
Как
w, но ограничено регистрами с 0 по 7 включительно. Upl-
Один из восьми низших регистров SVE предиката (
P0доP7) Upa-
Любой из регистров предиката SVE (
P0доP15) I-
Целочисленная константа, допустимая в качестве непосредственного операнда в инструкции
ADD J-
Целочисленная константа, допустимая в качестве непосредственного операнда в инструкции
SUB(после отрицания) K-
Целочисленная константа, используемая с 32-битной логической инструкцией
L-
Целочисленная константа, используемая с 64-битной логической инструкцией
M-
Целочисленная константа, допустимая в качестве непосредственного операнда в 32-битной псевдоинструкции
MOV. ПсевдоинструкцияMOVможет быть собрана в одну из нескольких различных машинных инструкций в зависимости от значения N-
Целочисленная константа, допустимая в качестве непосредственного операнда в 64-битной псевдоинструкции
MOV S-
Абсолютный символический адрес или ссылка на метку
Y-
Константа плавающей точки ноль
Z-
Целочисленная константа ноль
Ush-
Высшая часть (биты 12 и выше) смещения pc-относительного адреса символа в пределах 4 ГБ от инструкции
Q-
Адрес памяти, использующий один базовый регистр без смещения
Ump-
Адрес памяти, подходящий для инструкции пары загрузки/хранения в режимах SI, DI, SF и DF
- AMD GCN —config/gcn/constraints.md
-
I-
Целочисленное непосредственное значение в диапазоне от −16 до 64
J-
Непосредственное 16-битное знаковое целое
Kf-
Непосредственное значение −1
L-
Непосредственное 15-битное беззнаковое целое
A-
Непосредственная константа, которая может быть включена в кодировку инструкции: целое −16..64 или число с плавающей точкой 0.0, ±0.5, ±1.0, ±2.0, ±4.0, 1.0/(2.0*ПИ)
B-
Непосредственное 32-битное знаковое целое, которое может быть прикреплено к кодировке инструкции
C-
Непосредственное 32-битное целое в диапазоне −16..4294967295 (т.е. 32-битное беззнаковое целое или ограничение ‘A’)
DA-
Непосредственная 64-битная константа, которая может быть разделена на две константы ‘A’
DB-
Непосредственная 64-битная константа, которая может быть разделена на две константы ‘B’
U-
Любой
unspec Y-
Любой
symbol_refилиlabel_ref v-
Регистр VGPR
Sg-
Регистр SGPR
SD-
Регистры SGPR, допустимые для назначений инструкций, включая VCC, M0 и EXEC
SS-
Регистры SGPR, допустимые для источников инструкций, включая VCC, M0, EXEC и SCC
Sm-
Регистры SGPR, допустимые в качестве источника для скалярных инструкций памяти (исключая M0 и EXEC)
Sv-
Регистры SGPR, допустимые в качестве источника или назначения для векторных инструкций (исключая EXEC)
ca-
Все регистры условий: SCC, VCCZ, EXECZ
cs-
Скалярный регистр условия: SCC
cV-
Векторный регистр условия: VCC, VCC_LO, VCC_HI
e-
Регистр EXEC (EXEC_LO и EXEC_HI)
RB-
Операнд памяти с адресным пространством, подходящим для инструкций
buffer_* RF-
Операнд памяти с адресным пространством, подходящим для инструкций
flat_* RS-
Операнд памяти с адресным пространством, подходящим для инструкций
s_* RL-
Операнд памяти с адресным пространством, подходящим для инструкций LDS
ds_* RG-
Операнд памяти с адресным пространством, подходящим для инструкций GDS
ds_* RD-
Операнд памяти с адресным пространством, подходящим для любых инструкций
ds_* RM-
Операнд памяти с адресным пространством, подходящим для инструкций
global_*
- ARC —config/arc/constraints.md
-
q-
Регистры, пригодные для использования в 16-битных инструкциях ARCompact:
r0-r3,r12-r15. Это ограничение может соответствовать только при использовании опции -mq. eРегистры, пригодные для использования в качестве базовых регистров адресов памяти в 16-битных инструкциях памяти ARCompact:
r0-r3,r12-r15,sp. Это ограничение может соответствовать только при использовании опции -mq.D-
Регистры 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 family—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 family—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 family—config/bfin/constraints.md
-
a-
Регистр P
d-
Регистр D
z-
Регистр P, изменённый вызовом.
qn-
Один регистр. Если n находится в диапазоне от 0 до 7, соответствующий регистр D. Если это
A, то регистр P0. D-
Регистр D с чётным номером
W-
Регистр D с нечётным номером
e-
Регистр аккумулятора
A-
Регистр аккумулятора с чётным номером
B-
Регистр аккумулятора с нечётным номером
b-
Регистр I
v-
Регистр B
f-
Регистр M
c-
Регистры, используемые для циклического буферирования, т.е. регистры I, B или L.
C-
Регистр CC
t-
LT0 или LT1
k-
LC0 или LC1
u-
LB0 или LB1
x-
Любой регистр D, P, B, M, I или L
y-
Дополнительные регистры, обычно используемые только в прологах и эпилогах: RETS, RETN, RETI, RETX, RETE, ASTAT, SEQSTAT и USP.
w-
Любой регистр, кроме аккумуляторов или CC.
Ksh-
Целое число со знаком 16 бит (в диапазоне от −32768 до 32767)
Kuh-
Целое число без знака 16 бит (в диапазоне от 0 до 65535)
Ks7-
Целое число со знаком 7 бит (в диапазоне от −64 до 63)
Ku7-
Целое число без знака 7 бит (в диапазоне от 0 до 127)
Ku5-
Целое число без знака 5 бит (в диапазоне от 0 до 31)
Ks4-
Целое число со знаком 4 бит (в диапазоне от −8 до 7)
Ks3-
Целое число со знаком 3 бит (в диапазоне от −3 до 4)
Ku3-
Целое число без знака 3 бит (в диапазоне от 0 до 7)
Pn-
Константа n, где n — однозначная константа в диапазоне от 0 до 4.
PA-
Целое число, равное одной из констант MACFLAG_XXX, подходящей для использования с любым аккумулятором.
PB-
Целое число, равное одной из констант MACFLAG_XXX, подходящей только для использования с аккумулятором A1.
M1-
Константа 255.
M2-
Константа 65535.
J-
Целая константа с точно одним установленным битом.
L-
Целая константа со всеми установленным битами, кроме ровно одного.
HQЛюбой SYMBOL_REF.
- C-SKY—config/csky/constraints.md
-
a-
Минимальные регистры r0 - r7.
b-
Низкие регистры r0 - r15.
c-
Регистр C.
y-
Регистры HI и LO.
l-
Регистр LO.
h-
Регистр HI.
v-
Векторные регистры.
z-
Регистр указателя стека (SP).
Q-
Адрес памяти, использующий базовый регистр с коротким смещением или индексный регистр со своим масштабом.
WАдрес памяти, использующий базовый регистр с индексным регистром и его масштабом.
- Epiphany—config/epiphany/constraints.md
-
U16-
Константа без знака 16 бит.
K-
Константа без знака 5 бит.
L-
Константа со знаком 11 бит.
Cm1-
Константа со знаком 11 бит, добавленная к −1. Может соответствовать только при активном параметре -m1reg-reg.
Cl1-
Левый сдвиг на −1, т.е. маска бита с блоком ведущих единиц, остальная часть — блок хвостовых нулей. Может соответствовать только при активном параметре -m1reg-reg.
Cr1-
Правый сдвиг на −1, т.е. маска бита с конечным блоком единиц, остальная часть — нули. Или, другими словами, на единицу меньше степени двойки. Может соответствовать только при активном параметре -m1reg-reg.
Cal-
Константа для арифметических/логических операций. Это подобно
i, за исключением того, что для кода, независимого от позиции, не допускаются символы/выражения, требующие перераспределения. Csy-
Символьная константа для инструкции вызова/перехода.
Rcs-
Класс регистров, используемых в коротких инструкциях. Это ограничение класса регистров, и, следовательно, может управлять распределением регистров. Это ограничение не будет соответствовать, если -mprefer-short-insn-regs не включено.
Rsc-
Класс регистров, которые могут использоваться для хранения адреса вызова sibcall. То есть регистр, сохраняемый вызывающим процессом.
Rct-
Класс регистров управления ядром.
Rgs-
Группа регистров, используемых в коротких инструкциях. Это ограничение не использует класс регистров, поэтому оно только пассивно соответствует подходящим регистрам и не управляет распределением регистров.
Rra-
Соответствует возвращаемому адресу, если он может быть заменён регистром ссылки.
Rcc-
Соответствует регистру целочисленных кодов состояния.
Sra-
Соответствует возвращаемому адресу, если он находится в слоте стека.
CfmСоответствует значениям регистров управления для переключения режима fp, которые инкапсулированы в
UNSPEC_FP_MODE.
- FRV—config/frv/frv.h
-
a-
Регистр в классе
ACC_REGS(acc0доacc7). b-
Регистр в классе
EVEN_ACC_REGS(acc0доacc7). c-
Регистр в классе
CC_REGS(fcc0доfcc3иicc0доicc3). d-
Регистр в классе
GPR_REGS(gr0доgr63). e-
Регистр в классе
EVEN_REGS(gr0доgr63). Нечётные регистры исключены не в классе, а с помощью машинного режима больше 4 байт. f-
Регистр в классе
FPR_REGS(fr0доfr63). h-
Регистр в классе
FEVEN_REGS(fr0доfr63). Нечётные регистры исключены не в классе, а с помощью машинного режима больше 4 байт. l-
Регистр в классе
LR_REG(регистрlr). q-
Регистр в классе
QUAD_REGS(gr2доgr63). Номера регистров, не делящиеся на 4, исключены не в классе, а с помощью машинного режима больше 8 байт. t-
Регистр в классе
ICC_REGS(icc0доicc3). u-
Регистр в классе
FCC_REGS(fcc0доfcc3). v-
Регистр в классе
ICR_REGS(cc4доcc7). w-
Регистр в классе
FCR_REGS(cc0доcc3). x-
Регистр в классе
QUAD_FPR_REGS(fr0доfr63). Номера регистров, не делящиеся на 4, исключены не в классе, а с помощью машинного режима больше 8 байт. z-
Регистр в классе
SPR_REGS(lcrиlr). A-
Регистр в классе
QUAD_ACC_REGS(acc0доacc7). B-
Регистр в классе
ACCG_REGS(accg0доaccg7). C-
Регистр в классе
CR_REGS(cc0доcc7). G-
Плавающая точка, константа ноль
I-
Константа 6-битного знакового целого числа
J-
Константа 10-битного знакового целого числа
L-
Константа 16-битного знакового целого числа
M-
Константа 16-битного беззнакового целого числа
N-
Константа 12-битного знакового целого числа, отрицательная (от -2048 до -1)
O-
Константа ноль
P-
Константа 12-битного знакового целого числа, больше нуля (от 1 до 2047)
- FT32—config/ft32/constraints.md
-
A-
Абсолютный адрес
B-
Адрес смещения
W-
Операнд косвенной памяти по регистру
e-
Адрес смещения.
f-
Адрес смещения.
O-
Константа ноль или один
I-
16-битная константа со знаком (−32768 … 32767)
w-
Маска битового поля для bext или bins
x-
Инвертированная маска битового поля для bext или bins
L-
16-битная беззнаковая константа, кратная 4 (0 … 65532)
S-
20-битная константа со знаком (−524288 … 524287)
b-
Константа для ширины битового поля (1 … 16)
KA-
10-битная константа со знаком (−512 … 511)
- Hewlett-Packard PA-RISC—config/pa/pa.h
-
a-
Общий регистр 1
f-
Регистр с плавающей точкой
q-
Регистр смещения
x-
Регистр с плавающей точкой (устаревший)
y-
Верхний регистр с плавающей точкой (32-битный), регистр с плавающей точкой (64-битный)
Z-
Любой регистр
I-
Константа 11-битного знакового целого числа
J-
Константа 14-битного знакового целого числа
K-
Целочисленная константа, которая может быть размещена с помощью инструкции
zdepi L-
Константа 5-битного знакового целого числа
M-
Целочисленная константа 0
N-
Целочисленная константа, которая может быть загружена с помощью инструкции
ldil O-
Целочисленная константа, значение которой плюс один является степенью 2
P-
Целочисленная константа, которая может быть использована для операций
andв инструкцияхdepiиextru S-
Целочисленная константа 31
U-
Целочисленная константа 63
G-
Константа плавающей точки 0.0
A-
Операнд памяти таблицы данных связывания
Q-
Операнд памяти, который может использоваться в качестве целевого операнда инструкции сохранения целого числа
R-
Масштабируемый или не масштабируемый индексированный операнд памяти
T-
Операнд памяти для загрузки и сохранения чисел с плавающей точкой
WОперанд косвенной памяти по регистру
- Intel IA-64—config/ia64/ia64.h
-
a-
Общие регистры
r0доr3для инструкцииaddl b-
Регистр ветвления
c-
Регистр предиката («c» как в «условном»)
d-
Прикладной регистр, находящийся в блоке М
e-
Прикладной регистр, находящийся в блоке I
f-
Регистр с плавающей точкой
m-
Операнд памяти. Если используется вместе с ‘<’ или ‘>’, операнд может иметь постприращение и постдекремент, которые требуют печати с ‘%Pn’ в IA-64.
G-
Константы плавающей точки 0.0 или 1.0
I-
14-битная константа со знаком
J-
22-битная константа со знаком
K-
8-битная константа со знаком для логических инструкций
L-
8-битная скорректированная константа со знаком для псевдоопераций сравнения
M-
6-битная беззнаковая константа для сдвигов
N-
9-битная константа со знаком для постприращений загрузки и сохранения
O-
Константа ноль
P-
0 или −1 для инструкции
dep Q-
Неизменяемая память для загрузки и сохранения чисел с плавающей точкой
R-
Целочисленная константа в диапазоне от 1 до 4 для инструкции
shladd SОперанд памяти, за исключением постприращений и постдекрементов. Сейчас это примерно то же самое, что ‘m’, когда не используется вместе с ‘<’ или ‘>’.
- M32C—config/m32c/m32c.cc
-
RspRfbRsb-
‘$sp’, ‘$fb’, ‘$sb’.
Rcr-
Любой регистр управления, если его разрядность 16 бит (ничего, если регистры управления имеют разрядность 24 бита)
Rcl-
Любой регистр управления, если его разрядность 24 бита.
R0wR1wR2wR3w-
$r0, $r1, $r2, $r3.
R02-
$r0 или $r2, или $r2r0 для 32-битовых значений.
R13-
$r1 или $r3, или $r3r1 для 32-битовых значений.
Rdi-
Регистр, способный хранить 64-битовое значение.
Rhl-
$r0 или $r1 (регистры с адресуемыми старшими/младшими байтами)
R23-
$r2 или $r3
Raa-
Регистры адресации
Raw-
Регистры адресации, если их разрядность 16 бит.
Ral-
Регистры адресации, если их разрядность 24 бита.
Rqi-
Регистры, которые могут хранить значения QI.
Rad-
Регистры, которые могут использоваться со смещениями ($a0, $a1, $sb).
Rsi-
Регистры, которые могут хранить 32-битовые значения.
Rhi-
Регистры, которые могут хранить 16-битовые значения.
Rhc-
Регистры, которые могут хранить 16-битовые значения, включая все регистры управления.
Rra-
$r0 до R1, плюс $a0 и $a1.
Rfl-
Регистр флагов.
Rmm-
Базированные в памяти псевдорегистры $mem0 до $mem15.
Rpi-
Регистры, которые могут хранить указатели (16-битные регистры для r8c, m16c; 24-битные регистры для m32cm, m32c).
Rpa-
Сопоставляет несколько регистров в режиме PARALLEL для формирования более крупного регистра. Используется для сопоставления значений возврата функций.
Is3-
−8 … 7
IS1-
−128 … 127
IS2-
−32768 … 32767
IU2-
0 … 65535
In4-
−8 … −1 или 1 … 8
In5-
−16 … −1 или 1 … 16
In6-
−32 … −1 или 1 … 32
IM2-
−65536 … −1
Ilb-
8-битовое значение с ровно одним установленным битом.
Ilw-
16-битовое значение с ровно одним установленным битом.
Sd-
Общие режимы адресации памяти src/dest.
Sa-
Адрес памяти, используемый с $a0 или $a1.
Si-
Память, адресуемая с непосредственными адресами.
Ss-
Память, адресуемая с помощью указателя стека ($sp).
Sf-
Память, адресуемая с помощью регистра базы кадра ($fb).
Ss-
Память, адресуемая с помощью регистра малой базы ($sb).
S1$r1h
- LoongArch—config/loongarch/constraints.md
-
fРегистр с плавающей запятой (если доступен).
kОперанд памяти, адрес которого формируется базовым регистром и (необязательно масштабируемым) индексным регистром.
l16-битная константа со знаком.
mОперанд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и
st.wиld.w.I12-битная константа со знаком (для арифметических инструкций).
K12-битная константа без знака (для логических инструкций).
ZBАдрес, который хранится в универсальном регистре. Смещение равно нулю.
ZCОперанд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и
ll.wиsc.w.
- MicroBlaze—config/microblaze/constraints.md
-
d-
Универсальный регистр (
r0доr31). z-
Регистр состояния (
rmsr,$fcc1до$fcc7).
- MIPS—config/mips/constraints.md
-
d-
Универсальный регистр. Это эквивалентно
rза исключением генерации кода MIPS16, в котором используется набор регистров MIPS16. f-
Регистр с плавающей запятой (если доступен).
h-
Раньше регистр
hi. Данное ограничение больше не поддерживается. l-
Регистр
lo. Используйте этот регистр для хранения значений, не превышающих размера слова. x-
Объединенные регистры
hiиlo. Используйте этот регистр для хранения значений двойной длины. c-
Регистр, подходящий для косвенного перехода. Для -mabicalls это всегда будет
$25. v-
Регистр
$3. Не используйте это ограничение в новом коде; оно сохраняется только для совместимости с glibc. y-
Эквивалентно
r; сохранено для обратной совместимости. z-
Регистр состояния кода с плавающей запятой.
I-
16-битная константа со знаком (для арифметических инструкций).
J-
Целое ноль.
K-
16-битная константа без знака (для логических инструкций).
L-
32-битная константа со знаком, в которой младшие 16 бит равны нулю. Такие константы можно загрузить с помощью
lui. M-
Константа, которую нельзя загрузить с помощью
lui,addiuилиori. N-
Константа в диапазоне от -65535 до -1 (включительно).
O-
15-битная константа со знаком.
P-
Константа в диапазоне от 1 до 65535 (включительно).
G-
Ноль с плавающей запятой.
R-
Адрес, который может использоваться в незамакросном загрузке или сохранении.
ZC-
Операнд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и
llиsc. ZDАдрес, подходящий для инструкции
prefetch, или для любой другой инструкции с тем же режимом адресации, что иprefetch.
- Motorola 680x0—config/m68k/constraints.md
-
a-
Регистр адресации
d-
Регистр данных
f-
Регистр с плавающей запятой 68881, если доступен
I-
Целое число в диапазоне от 1 до 8
J-
16-битное целое число со знаком
K-
Целое число со знаком, абсолютное значение которого больше 0x80
L-
Целое число со знаком в диапазоне от −8 до −1
M-
Целое число со знаком, абсолютное значение которого больше 0x100
N-
Диапазон от 24 до 31, вращение: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 по загрузке/сохранению эксклюзивно.
w-
Операнд памяти, подходящий для инструкций ввода/вывода и кеширования по загрузке/сохранению.
- OpenRISC—config/or1k/constraints.md
-
I-
Целое число, которое является допустимым непосредственным операндом в инструкции, принимающей знаковое 16-битное число. Диапазон от -32768 до 32767.
K-
Целое число, которое является допустимым непосредственным операндом в инструкции, принимающей беззнаковое 16-битное число. Диапазон от 0 до 65535.
M-
Знаковая 16-битная константа, сдвинутая влево на 16 бит. (Используется с
l.movhi). O-
Ноль
- PDP-11—config/pdp11/constraints.md
-
a-
Регистры с плавающей точкой AC0–AC3. Их можно загрузить/сохранить в памяти одной инструкцией.
d-
Регистры общего назначения с нечетными номерами (R1, R3, R5). Используются для операций умножения на 16 бит.
D-
Ссылка на память, закодированная в коде операции, но не с автоинкрементом или автодекрементом.
f-
Любой из регистров с плавающей точкой (AC0–AC5).
G-
Константа с плавающей точкой 0.
h-
Регистры с плавающей точкой AC4 и AC5. Их нельзя загрузить/сохранить в памяти одной инструкцией.
I-
Целочисленная константа, помещающаяся в 16 бит.
J-
Целочисленная константа, младшие 16 биты которой равны нулю.
K-
Целочисленная константа, не удовлетворяющая ограничениям для кодов ‘I’ или ‘J’.
L-
Целочисленная константа 1.
M-
Целочисленная константа -1.
N-
Целочисленная константа 0.
O-
Целочисленные константы от 0 до 3; сдвиги на эти значения обрабатываются как несколько сдвигов на один бит, а не как один сдвиг переменной длины.
Q-
Ссылка на память, которая требует дополнительного слова (адреса или смещения) после кода операции.
R-
Ссылка на память, закодированная в коде операции.
- PowerPC and IBM RS6000—config/rs6000/constraints.md
-
r-
Регистр общего назначения (GPR),
r0…r31. b-
Базовый регистр. Как
r, ноr0не разрешено, поэтомуr1…r31. f-
Регистр с плавающей точкой (FPR),
f0…f31. d-
Регистр с плавающей точкой. В настоящее время это то же, что и
f; историческиfбыл для одинарной точности, аd— для двойной точности с плавающей точкой. v-
Векторный регистр Altivec (VR),
v0…v31. wa-
Регистр VSX (VSR),
vs0…vs63. Это либо FPR (vs0…vs31являютсяf0…f31) или VR (vs32…vs63являютсяv0…v31).При использовании
wa, вы должны использовать модификатор вывода%x, чтобы напечатать правильный номер регистра. Например:asm ("xvadddp %x0,%x1,%x2" : "=wa" (v1) : "wa" (v2), "wa" (v3));Вы не должны использовать
%xдля операндовv:asm ("xsaddqp %0,%1,%2" : "=v" (v1) : "v" (v2), "v" (v3)); c-
Регистр счётчика,
ctr. l-
Регистр связи,
lr. x-
Поле регистра состояния 0,
cr0. y-
Любое поле регистра состояния,
cr0…cr7. I-
Подписанное 16-битное константа.
J-
Беззнаковая 16-битная константа, сдвинутая влево на 16 бит (используйте
Lвместо дляSImodeконстант). K-
Беззнаковая 16-битная константа.
L-
Подписанная 16-битная константа, сдвинутая влево на 16 бит.
eI-
Подписанная 34-битная целочисленная константа, если поддерживаются префиксные инструкции.
eP-
Скалярная константа с плавающей точкой или векторная константа, которая может быть загружена в регистр VSX одной префиксной инструкцией.
eQ-
IEEE 128-битная константа, которая может быть загружена в регистр VSX инструкцией
lxvkq. m-
Операнд памяти. Обычно
mне допускает адресов, которые обновляют базовый регистр. Если также используется ограничение<или>, они разрешены, и поэтому на целевых платформах PowerPC в этом случае безопасно использоватьm<>в оператореasm, если этот операторasmобращается к операнду ровно один раз. Операторasmтакже должен использовать%U<opno>в качестве плейсхолдера для флага «обновление» в соответствующей инструкции загрузки или сохранения. Например:asm ("st%U0 %1,%0" : "=m<>" (mem) : "r" (val));верно, но:
asm ("st %1,%0" : "=m<>" (mem) : "r" (val));неверно.
Q-
Операнд памяти, адресованный только базовым регистром.
Z-
Операнд памяти, к которому осуществляется доступ с индексированием или косвенным адресованием.
a-
Индексированный или косвенный адрес.
- PRU—config/pru/constraints.md
-
I-
Беззнаковая 8-битная целочисленная константа.
J-
Беззнаковая 16-битная целочисленная константа.
L-
Беззнаковая 5-битная целочисленная константа (для сдвигов).
T-
Метка константы сегмента текста (память программы).
Z-
Целочисленная константа ноль.
- RL78—config/rl78/constraints.md
-
Int3Целочисленная константа в диапазоне от 1 до 7.
Int8Целочисленная константа в диапазоне от 0 до 255.
JЦелочисленная константа в диапазоне от -255 до 0.
KЦелочисленная константа 1.
LЦелочисленная константа -1.
MЦелочисленная константа 0.
NЦелочисленная константа 2.
OЦелочисленная константа -2.
PЦелочисленная константа в диапазоне от 1 до 15.
QbiВстроенные типы сравнения – eq, ne, gtu, ltu, geu и leu.
QscСинтетические типы сравнения – gt, lt, ge и le.
WabСсылка на память с абсолютным адресом.
WbcСсылка на память с использованием
BCв качестве базового регистра с необязательным смещением.WcaСсылка на память с использованием
AX,BC,DE, илиHLдля адреса для вызовов.WcvСсылка на память с использованием любой пары 16-битных регистров для адреса для вызовов.
Wd2Ссылка на память с использованием
DEв качестве базового регистра с необязательным смещением.WdeСсылка на память с использованием
DEв качестве базового регистра без смещения.WfrЛюбая ссылка на память на адрес в дальнем адресном пространстве.
Wh1Ссылка на память с использованием
HLв качестве базового регистра с необязательным однобайтовым смещением.WhbСсылка на память с использованием
HLв качестве базового регистра, сBилиCв качестве индексного регистра.WhlСсылка на память с использованием
HLв качестве базового регистра без смещения.Ws1Ссылка на память с использованием
SPв качестве базового регистра с необязательным однобайтовым смещением.YЛюбая ссылка на память на адрес в ближнем адресном пространстве.
AРегистр
AX.BРегистр
BC.DРегистр
DE.RРегистры от
AдоL.SРегистр
SP.TРегистр
HL.Z08W16-битный регистр
R8.Z10W16-битный регистр
R10.ZintРегистры, зарезервированные для прерываний (от
R24доR31).aРегистр
A.bРегистр
B.cРегистр
C.dРегистр
D.eРегистр
E.hРегистр
H.lРегистр
L.vВиртуальные регистры.
wРегистр
PSW.x-
Регистр
X.
- RISC-V—config/riscv/constraints.md
-
f-
Регистр с плавающей точкой (если доступен).
I-
Целочисленная непосредственная константа типа I, 12-битная со знаком.
J-
Целочисленный ноль.
K-
Беззнаковая непосредственная константа в 5 бит для инструкций доступа к CSR.
A-
Адрес, хранящийся в регистре общего назначения.
S-
Ограничение, соответствующее абсолютному символическому адресу.
vr-
Векторный регистр (если доступен).
vd-
Векторный регистр, за исключением v0 (если доступен).
vm-
Векторный регистр, только v0 (если доступен).
- 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-битный знаковый непосредственный операнд) N-
То же, что и ‘K’, за исключением того, что проверяет, что биты, не находящиеся в диапазоне нижних 32 бит, равны нулю. Должно использоваться вместо ‘K’ для режимов, более широких, чем
SImode O-
Константа 4096
G-
Ноль с плавающей запятой
H-
Знаковая 13-битная константа, расширенная со знаком до 32 или 64 бит
P-
Константа -1
Q-
Константа с плавающей запятой, целое представление которой может быть перемещено в регистр целого числа с помощью одной инструкции сеthi
R-
Константа с плавающей запятой, целое представление которой может быть перемещено в регистр целого числа с помощью одной инструкции mov
S-
Константа с плавающей запятой, целое представление которой может быть перемещено в регистр целого числа с помощью последовательности инструкций high/lo_sum
T-
Адрес памяти, выровненный по границе 8 байт
U-
Четный регистр
W-
Адрес памяти для регистров с ограничением ‘e’
w-
Адрес памяти только с базовым регистром
Y-
Векторный ноль
- 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).
- 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-
Операнд адреса без регистра сегмента.
- 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-13.3.0/gcc/Machine-Constraints.html