Spec-Zone.ru › GCC 15

6.11.3.4 Ограничения для отдельных машин

По возможности используйте буквы общих ограничений в аргументах asm, поскольку они понятнее передают смысл людям, читающим ваш код. Если это невозможно, используйте буквы ограничений, значения которых обычно очень похожи в разных архитектурах. Наиболее часто используются ограничения «m» и «r» (соответственно для памяти и регистров общего назначения; см. Простые ограничения), а также «I» — обычно буква, обозначающая наиболее распространённый формат непосредственных констант.

Каждая архитектура определяет дополнительные ограничения. Эти ограничения используются самим компилятором при генерации инструкций, а также в операторах asm; поэтому некоторые ограничения не особенно полезны для asm. Ниже приведена сводка некоторых ограничений, зависящих от машины, доступных на отдельных машинах; она включает как ограничения, полезные для asm, так и те, которые таковыми не являются. Исходный файл компилятора, указанный в заголовке таблицы для каждой архитектуры, является окончательным источником сведений о значениях ограничений этой архитектуры.

Семейство AArch64—config/aarch64/constraints.md
k

Регистр указателя стека (SP)

w

Регистр с плавающей точкой, векторный регистр Advanced SIMD или векторный регистр SVE

x

Как w, но только для регистров от 0 до 15 включительно.

y

Как w, но только для регистров от 0 до 7 включительно.

Upl

Один из восьми младших регистров-предикатов SVE (от P0 до P7)

Upa

Любой из регистров-предикатов SVE (от P0 до P15)

I

Целочисленная константа, допустимая в качестве непосредственного операнда инструкции ADD

J

Целочисленная константа, допустимая в качестве непосредственного операнда инструкции SUB (после изменения знака)

K

Целочисленная константа, которую можно использовать в 32-разрядной логической инструкции

L

Целочисленная константа, которую можно использовать в 64-разрядной логической инструкции

M

Целочисленная константа, допустимая в качестве непосредственного операнда 32-разрядной псевдоинструкции MOV. В зависимости от значения MOV может быть преобразована при сборке в одну из нескольких различных машинных инструкций

N

Целочисленная константа, допустимая в качестве непосредственного операнда 64-разрядной псевдоинструкции MOV

S

Абсолютный символьный адрес или ссылка на метку

Y

Нулевая константа с плавающей точкой

Z

Нулевая целочисленная константа

Ush

Старшая часть (биты 12 и выше) адреса символа относительно счетчика команд, находящегося в пределах 4 ГБ от инструкции

Q

Адрес памяти, использующий один базовый регистр без смещения

Ump

Адрес памяти, подходящий для парной инструкции загрузки/сохранения в режимах SI, DI, SF и DF

AMD GCN —config/gcn/constraints.md
I

Непосредственное целое число в диапазоне от −16 до 64

J

Непосредственное 16-разрядное целое число со знаком

Kf

Непосредственная константа −1

L

Непосредственное 15-разрядное целое число без знака

A

Непосредственная константа, которую можно встроить в кодировку инструкции: целое число −16..64 или число с плавающей точкой 0.0, +/−0.5, +/−1.0, +/−2.0, +/−4.0, 1.0/(2.0*PI)

B

Непосредственное 32-разрядное целое число со знаком, которое можно включить в кодировку инструкции

C

Непосредственное 32-разрядное целое число в диапазоне −16..4294967295 (то есть 32-разрядное целое число без знака или ограничение ‘A’)

DA

Непосредственная 64-разрядная константа, которую можно разделить на две константы ‘A’

DB

Непосредственная 64-разрядная константа, которую можно разделить на две константы ‘B’

U

Любой unspec

Y

Любой symbol_ref или label_ref

v

Регистр VGPR

a

Регистр ускорителя VGPR (начиная с CDNA1)

Sg

Регистр SGPR

SD

Регистры SGPR, допустимые в качестве приемников инструкций, включая VCC, M0 и EXEC

SS

Регистры SGPR, допустимые в качестве источников инструкций, включая VCC, M0, EXEC и SCC

Sm

Регистры SGPR, допустимые в качестве источника инструкций скалярной памяти (исключая M0 и EXEC)

Sv

Регистры SGPR, допустимые в качестве источника или приемника векторных инструкций (исключая EXEC)

ca

Все регистры условий: SCC, VCCZ, EXECZ

cs

Регистр скалярного условия: SCC

cV

Регистр векторного условия: VCC, VCC_LO, VCC_HI

e

Регистр EXEC (EXEC_LO и EXEC_HI)

RB

Операнд памяти с адресным пространством, подходящим для инструкций buffer_*

RF

Операнд памяти с адресным пространством, подходящим для инструкций flat_*

RS

Операнд памяти с адресным пространством, подходящим для инструкций s_*

RL

Операнд памяти с адресным пространством, подходящим для инструкций LDS ds_*

RG

Операнд памяти с адресным пространством, подходящим для инструкций GDS ds_*

RD

Операнд памяти с адресным пространством, подходящим для любых инструкций ds_*

RM

Операнд памяти с адресным пространством, подходящим для инструкций global_*

ARC —config/arc/constraints.md
q

Регистры, используемые в 16-разрядных инструкциях ARCompact: r0-r3, r12-r15. Это ограничение может соответствовать только при активном параметре -mq.

e

Регистры, используемые в качестве базовых регистров адресов памяти в 16-разрядных инструкциях памяти ARCompact: r0-r3, r12-r15, sp. Это ограничение может соответствовать только при активном параметре -mq.

D

64-разрядные регистры ARC FPX (dpfp). D0, D1.

I

Целочисленная константа со знаком размером 12 бит.

Cal

Константа для арифметических/логических операций. Это может быть любая константа, которую ассемблер или компоновщик может поместить в длинное непосредственное значение без использования перемещения PIC.

K

Целочисленная константа без знака размером 3 бита.

L

Целочисленная константа без знака размером 6 бит.

CnL

Дополнение до единицы целочисленной константы без знака размером 6 бит.

CmL

Дополнение до двух целочисленной константы без знака размером 6 бит.

M

Целочисленная константа без знака размером 5 бит.

O

Целочисленная константа без знака размером 7 бит.

P

Целочисленная константа без знака размером 8 бит.

H

Любое значение const_double.

Семейство ARM—config/arm/constraints.md
h

В режиме Thumb основные регистры r8-r15.

k

Регистр указателя стека.

l

В режиме Thumb основные регистры r0-r7. В режиме ARM это псевдоним ограничения r.

t

Регистры с плавающей точкой VFP s0-s31. Используются для 32-разрядных значений.

w

Регистры с плавающей точкой VFP d0-d31 и соответствующее подмножество d0-d15, определяемое параметрами командной строки. Используются только для 64-разрядных значений. Недопустимы для Thumb1.

y

Регистры сопроцессора iWMMX.

z

Регистры GR iWMMX.

G

Константа с плавающей точкой 0.0

I

Целое число, допустимое в качестве непосредственного операнда инструкции обработки данных. То есть целое число в диапазоне от 0 до 255, циклически сдвинутое на кратное 2 число разрядов

J

Целое число в диапазоне от −4095 до 4095

K

Целое число, удовлетворяющее ограничению ‘I’ после инвертирования (дополнения до единицы)

L

Целое число, удовлетворяющее ограничению ‘I’ после изменения знака (дополнения до двух)

M

Целое число в диапазоне от 0 до 32

Q

Ссылка на память, точный адрес которой содержится в одном регистре (для инструкций asm предпочтительно использовать «m»)

R

Элемент пула констант

S

Символ в текстовом сегменте текущего файла

Uv

Ссылка на память, подходящая для инструкций загрузки/сохранения VFP (регистр + константное смещение)

Uy

Ссылка на память, подходящая для инструкций загрузки/сохранения iWMMXt.

Uq

Ссылка на память, подходящая для инструкции ARMv4 ldrsb.

Семейство AVR—config/avr/constraints.md
l

Регистры от r0 до r15

a

Регистры от r16 до r23

d

Регистры от r16 до r31

w

Регистры от r24 до r31. Эти регистры можно использовать в команде ‘adiw’

e

Регистр-указатель (r26–r31)

b

Базовый регистр-указатель (r28–r31)

q

Регистр указателя стека (SPH:SPL)

t

Временный регистр r0

x

Пара регистров X (r27:r26)

y

Пара регистров Y (r29:r28)

z

Пара регистров Z (r31:r30)

I

Константа больше −1 и меньше 64

J

Константа больше −64 и меньше 1

K

Целочисленная константа 2

L

Целочисленная константа 0

M

Константа, помещающаяся в 8 бит

N

Целочисленная константа −1

O

Целочисленная константа 8, 16 или 24

P

Целочисленная константа 1

G

Константа с плавающей точкой 0.0

Q

Адрес памяти на основе указателя Y или Z со смещением.

Семейство Blackfin—config/bfin/constraints.md
a

Регистр P

d

Регистр D

z

Регистр P, содержимое которого уничтожается при вызове функции.

qn

Один регистр. Если n находится в диапазоне от 0 до 7, это соответствующий регистр D. Если n — A, то это регистр P0.

D

Регистр D с четным номером

W

Регистр D с нечетным номером

e

Регистр-аккумулятор.

A

Регистр-аккумулятор с четным номером.

B

Регистр-аккумулятор с нечетным номером.

b

Регистр I

v

Регистр B

f

Регистр M

c

Регистры, используемые для циклической буферизации, то есть регистры I, B или L.

C

Регистр CC.

t

LT0 или LT1.

k

LC0 или LC1.

u

LB0 или LB1.

x

Любой регистр D, P, B, M, I или L.

y

Дополнительные регистры, обычно используемые только в прологах и эпилогах: RETS, RETN, RETI, RETX, RETE, ASTAT, SEQSTAT и USP.

w

Любой регистр, кроме аккумуляторов и CC.

Ksh

16-разрядное целое число со знаком (в диапазоне от −32768 до 32767)

Kuh

16-разрядное целое число без знака (в диапазоне от 0 до 65535)

Ks7

7-разрядное целое число со знаком (в диапазоне от −64 до 63)

Ku7

7-разрядное целое число без знака (в диапазоне от 0 до 127)

Ku5

5-разрядное целое число без знака (в диапазоне от 0 до 31)

Ks4

4-разрядное целое число со знаком (в диапазоне от −8 до 7)

Ks3

3-разрядное целое число со знаком (в диапазоне от −3 до 4)

Ku3

3-разрядное целое число без знака (в диапазоне от 0 до 7)

Pn

Константа n, где n — однозначная константа в диапазоне от 0 до 4.

PA

Целое число, равное одной из констант MACFLAG_XXX и подходящее для использования с любым аккумулятором.

PB

Целое число, равное одной из констант MACFLAG_XXX и подходящее для использования только с аккумулятором A1.

M1

Константа 255.

M2

Константа 65535.

J

Целочисленная константа, в которой установлен ровно один бит.

L

Целочисленная константа, в которой все биты установлены, кроме ровно одного.

H
Q

Любой SYMBOL_REF.

C-SKY—config/csky/constraints.md
a

Мини-регистры r0 - r7.

b

Младшие регистры r0 - r15.

c

Регистр C.

y

Регистры HI и LO.

l

Регистр LO.

h

Регистр HI.

v

Векторные регистры.

z

Регистр указателя стека (SP).

Q

Адрес памяти, использующий базовый регистр с коротким смещением или индексный регистр с масштабированием.

W

Адрес памяти, использующий базовый регистр и индексный регистр с масштабированием.

Epiphany—config/epiphany/constraints.md
U16

16-разрядная константа без знака.

K

5-разрядная константа без знака.

L

11-разрядная константа со знаком.

Cm1

11-разрядная константа со знаком, к которой прибавлено −1. Соответствует только при активном параметре -m1reg-reg.

Cl1

Сдвиг −1 влево, то есть битовая маска с блоком старших единиц, за которым следует блок нулей. Соответствует только при активном параметре -m1reg-reg.

Cr1

Сдвиг −1 вправо, то есть битовая маска с блоком младших единиц, а остальные биты — нули. Иначе говоря, число на единицу меньше степени двойки. Соответствует только при активном параметре -m1reg-reg.

Cal

Константа для арифметических/логических операций. Аналогична i, за исключением того, что для позиционно-независимого кода запрещены символы и выражения, требующие перемещений.

Csy

Символьная константа для инструкции вызова/перехода.

Rcs

Класс регистров, используемых в коротких инструкциях. Это ограничение класса регистров, поэтому оно может управлять распределением регистров. Это ограничение не соответствует, если не активен параметр -mprefer-short-insn-regs.

Rsc

Класс регистров, которые можно использовать для хранения адреса вызова sibcall, то есть регистр, сохраняемый вызывающей функцией.

Rct

Класс основных управляющих регистров.

Rgs

Группа регистров, используемых в коротких инструкциях. Это ограничение не использует класс регистров, поэтому лишь пассивно соответствует подходящим регистрам и не управляет распределением регистров.

Rra

Соответствует адресу возврата, если его можно заменить регистром связи.

Rcc

Соответствует регистру целочисленного кода условий.

Sra

Соответствует адресу возврата, если он находится в слоте стека.

Cfm

Соответствует значениям управляющих регистров для переключения режима fp, которые заключены в UNSPEC_FP_MODE.

FRV—config/frv/frv.h
a

Регистр класса ACC_REGS (от acc0 до acc7).

b

Регистр класса EVEN_ACC_REGS (от acc0 до acc7).

c

Регистр класса CC_REGS (от fcc0 до fcc3 и от icc0 до icc3).

d

Регистр класса GPR_REGS (от gr0 до gr63).

e

Регистр класса EVEN_REGS (от gr0 до gr63). Регистры с нечетными номерами исключаются не из класса, а с помощью машинного режима размером более 4 байт.

f

Регистр класса FPR_REGS (от fr0 до fr63).

h

Регистр класса FEVEN_REGS (от fr0 до fr63). Регистры с нечетными номерами исключаются не из класса, а с помощью машинного режима размером более 4 байт.

l

Регистр класса LR_REG (регистр lr).

q

Регистр класса QUAD_REGS (от gr2 до gr63). Регистры с номерами, не делящимися на 4, исключаются не из класса, а с помощью машинного режима размером более 8 байт.

t

Регистр класса ICC_REGS (от icc0 до icc3).

u

Регистр класса FCC_REGS (от fcc0 до fcc3).

v

Регистр класса ICR_REGS (от cc4 до cc7).

w

Регистр класса FCR_REGS (от cc0 до cc3).

x

Регистр класса QUAD_FPR_REGS (от fr0 до fr63). Регистры с номерами, не делящимися на 4, исключаются не из класса, а с помощью машинного режима размером более 8 байт.

z

Регистр класса SPR_REGS (lcr и lr).

A

Регистр класса QUAD_ACC_REGS (от acc0 до acc7).

B

Регистр класса ACCG_REGS (от accg0 до accg7).

C

Регистр класса CR_REGS (от cc0 до cc7).

G

Нулевая константа с плавающей точкой

I

6-разрядная целочисленная константа со знаком

J

10-разрядная целочисленная константа со знаком

L

16-разрядная целочисленная константа со знаком

M

16-разрядная целочисленная константа без знака

N

12-разрядная целочисленная константа со знаком, имеющая отрицательное значение, то есть в диапазоне от −2048 до −1

O

Нулевая константа

P

12-разрядная целочисленная константа со знаком, имеющая положительное значение, то есть в диапазоне от 1 до 2047.

FT32—config/ft32/constraints.md
A

Абсолютный адрес

B

Адрес со смещением

W

Операнд памяти с косвенной адресацией через регистр

e

Адрес со смещением.

f

Адрес со смещением.

O

Нулевая или единичная константа

I

16-разрядная константа со знаком (−32768 … 32767)

w

Маска битового поля, подходящая для bext или bins

x

Инвертированная маска битового поля, подходящая для bext или bins

L

16-разрядная константа без знака, кратная 4 (0 … 65532)

S

20-разрядная константа со знаком (−524288 … 524287)

b

Константа, задающая ширину битового поля (1 … 16)

KA

10-разрядная константа со знаком (−512 … 511)

Hewlett-Packard PA-RISC—config/pa/pa.h
a

Регистр общего назначения 1

f

Регистр с плавающей точкой

q

Регистр величины сдвига

x

Регистр с плавающей точкой (устаревший)

y

Старшая половина регистра с плавающей точкой (32-разрядный), регистр с плавающей точкой (64-разрядный)

Z

Любой регистр

I

11-разрядная целочисленная константа со знаком

J

14-разрядная целочисленная константа со знаком

K

Целочисленная константа, которую можно поместить инструкцией zdepi

L

5-разрядная целочисленная константа со знаком

M

Целочисленная константа 0

N

Целочисленная константа, которую можно загрузить инструкцией ldil

O

Целочисленная константа, значение которой, увеличенное на единицу, является степенью двойки

P

Целочисленная константа, которую можно использовать для операций and в инструкциях depi и extru

S

Целочисленная константа 31

U

Целочисленная константа 63

G

Константа с плавающей точкой 0.0

A

Операнд памяти таблицы динамической компоновки lo_sum

Q

Операнд памяти, который можно использовать в качестве операнда-приемника инструкции сохранения целого числа

R

Индексируемый операнд памяти с масштабированием или без него

T

Операнд памяти для загрузки и сохранения чисел с плавающей точкой

W

Операнд памяти с косвенной адресацией через регистр

Intel IA-64—config/ia64/ia64.h
a

Регистр общего назначения от r0 до r3 для инструкции addl

b

Регистр переходов

c

Регистр предикатов (‘c’, как в слове «условный»)

d

Регистры приложений, находящиеся в модуле M

e

Регистры приложений, находящиеся в модуле I

f

Регистр с плавающей точкой

m

Операнд памяти. Если он используется вместе с ‘<’ или ‘>’, операнд может иметь постинкремент или постдекремент, для печати которых в IA-64 требуется использовать ‘%Pn’.

G

Константа с плавающей точкой 0.0 или 1.0

I

14-разрядная целочисленная константа со знаком

J

22-разрядная целочисленная константа со знаком

K

8-разрядная целочисленная константа со знаком для логических инструкций

L

8-разрядная скорректированная целочисленная константа со знаком для псевдоопераций сравнения

M

6-разрядная целочисленная константа без знака для величины сдвига

N

9-разрядная целочисленная константа со знаком для постинкремента при загрузке и сохранении

O

Нулевая константа

P

0 или −1 для инструкции dep

Q

Энергонезависимая память для загрузки и сохранения чисел с плавающей точкой

R

Целочисленная константа в диапазоне от 1 до 4 для инструкции shladd

S

Операнд памяти без постинкремента и постдекремента. Сейчас он примерно эквивалентен ‘m’, если не используется вместе с ‘<’ или ‘>’.

M32C—config/m32c/m32c.cc
Rsp
Rfb
Rsb

‘$sp’, ‘$fb’, ‘$sb’.

Rcr

Любой управляющий регистр, если его ширина составляет 16 бит (ничего, если ширина управляющих регистров составляет 24 бита)

Rcl

Любой управляющий регистр, если его ширина составляет 24 бита.

R0w
R1w
R2w
R3w

$r0, $r1, $r2, $r3.

R02

$r0 или $r2 либо $r2r0 для 32-битных значений.

R13

$r1 или $r3 либо $r3r1 для 32-битных значений.

Rdi

Регистр, способный хранить 64-битное значение.

Rhl

$r0 или $r1 (регистры с адресуемыми старшими/младшими байтами)

R23

$r2 или $r3

Raa

Регистры адреса

Raw

Регистры адреса, если их ширина составляет 16 бит.

Ral

Регистры адреса, если их ширина составляет 24 бита.

Rqi

Регистры, способные хранить значения QI.

Rad

Регистры, которые можно использовать со смещениями ($a0, $a1, $sb).

Rsi

Регистры, способные хранить 32-битные значения.

Rhi

Регистры, способные хранить 16-битные значения.

Rhc

Регистры, способные хранить 16-битные значения, включая все управляющие регистры.

Rra

$r0–R1, а также $a0 и $a1.

Rfl

Регистр флагов.

Rmm

Псевдорегистры на основе памяти $mem0–$mem15.

Rpi

Регистры, способные хранить указатели (16-битные регистры для r8c, m16c; 24-битные регистры для m32cm, m32c).

Rpa

Сопоставляет несколько регистров в PARALLEL, чтобы сформировать регистр большего размера. Используется для сопоставления возвращаемых функцией значений.

Is3

−8 … 7

IS1

−128 … 127

IS2

−32768 … 32767

IU2

0 … 65535

In4

−8 … −1 или 1 … 8

In5

−16 … −1 или 1 … 16

In6

−32 … −1 или 1 … 32

IM2

−65536 … −1

Ilb

8-битное значение, в котором установлен ровно один бит.

Ilw

16-битное значение, в котором установлен ровно один бит.

Sd

Распространённые режимы адресации памяти для источника/назначения.

Sa

Память, адресуемая с помощью $a0 или $a1.

Si

Память, адресуемая с помощью непосредственных адресов.

Ss

Память, адресуемая с помощью указателя стека ($sp).

Sf

Память, адресуемая с помощью регистра базового адреса кадра ($fb).

Ss

Память, адресуемая с помощью регистра малой базы ($sb).

S1

$r1h

LoongArch—config/loongarch/constraints.md
f

Регистр с плавающей точкой или векторный регистр (если доступен).

k

Операнд памяти, адрес которого формируется базовым регистром и (опционально масштабируемым) индексным регистром.

l

Знаковая 16-битная константа.

m

Операнд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и st.w и ld.w.

I

Знаковая 12-битная константа (для арифметических инструкций).

K

Беззнаковая 12-битная константа (для логических инструкций).

M

Константа, которую нельзя загрузить с помощью lui, addiu или ori.

N

Константа в диапазоне от -65535 до -1 включительно.

O

Знаковая 15-битная константа.

P

Константа в диапазоне от 1 до 65535 включительно.

R

Адрес, который можно использовать в немакросной инструкции загрузки или сохранения.

ZB

Адрес, хранящийся в регистре общего назначения. Смещение равно нулю.

ZC

Операнд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и ll.w и sc.w.

MicroBlaze—config/microblaze/constraints.md
d

Регистр общего назначения (r0–r31).

z

Регистр состояния (rmsr, $fcc1–$fcc7).

MIPS—config/mips/constraints.md
d

Регистр общего назначения. Эквивалентен r, если только не генерируется код MIPS16; в этом случае используется набор регистров MIPS16.

f

Регистр с плавающей точкой (если доступен).

h

Ранее — регистр hi. Это ограничение больше не поддерживается.

l

Регистр lo. Используйте этот регистр для хранения значений размером не больше слова.

x

Объединённые регистры hi и lo. Используйте этот регистр для хранения значений размером в двойное слово.

c

Регистр, подходящий для использования в косвенном переходе. Для -mabicalls это всегда будет $25.

v

Регистр $3. Не используйте это ограничение в новом коде; оно сохранено только для совместимости с glibc.

y

Эквивалентно r; сохранено для обратной совместимости.

z

Регистр кодов условий операций с плавающей точкой.

I

Знаковая 16-битная константа (для арифметических инструкций).

J

Целочисленный ноль.

K

Беззнаковая 16-битная константа (для логических инструкций).

L

Знаковая 32-битная константа, младшие 16 бит которой равны нулю. Такие константы можно загрузить с помощью lui.

M

Константа, которую нельзя загрузить с помощью lui, addiu или ori.

N

Константа в диапазоне от −65535 до −1 включительно.

O

Знаковая 15-битная константа.

P

Константа в диапазоне от 1 до 65535 включительно.

G

Ноль с плавающей точкой.

R

Адрес, который можно использовать в немакросной инструкции загрузки или сохранения.

ZC

Операнд памяти, адрес которого формируется базовым регистром и смещением, подходящим для использования в инструкциях с тем же режимом адресации, что и ll и sc.

ZD

Адрес, подходящий для инструкции prefetch или любой другой инструкции с тем же режимом адресации, что и prefetch.

Motorola 680x0—config/m68k/constraints.md
a

Регистр адреса

d

Регистр данных

f

Регистр с плавающей точкой 68881, если доступен

I

Целое число в диапазоне от 1 до 8

J

Знаковое 16-битное число

K

Знаковое число, модуль которого больше 0x80

L

Целое число в диапазоне от −8 до −1

M

Знаковое число, модуль которого больше 0x100

N

Диапазон от 24 до 31, rotatert:SI от 8 до 1, представленный как поворот

O

16 (для поворота с использованием swap)

P

Диапазон от 8 до 15, rotatert:HI от 8 до 1, представленный как поворот

R

Числа, обрабатываемые инструкцией mov3q

G

Константа с плавающей точкой, не являющаяся константой 68881

S

Операнды, соответствующие ’m’ при включённом -mpcrel

T

Операнды, соответствующие ’s’ при выключенном -mpcrel

Q

Режим косвенной адресации через регистр адреса

U

Адресация со смещением регистра

W

const_call_operand

Cs

symbol_ref или const

Ci

const_int

C0

const_int 0

Cj

Диапазон знаковых чисел, не помещающихся в 16 бит

Cmvq

Целые числа, допустимые для mvq

Capsw

Целые числа, допустимые для moveq с последующей инструкцией swap

Cmvz

Целые числа, допустимые для mvz

Cmvs

Целые числа, допустимые для mvs

Ap

push_operand

Ac

Нерегистровые операнды, допустимые в clr

Moxie—config/moxie/constraints.md
A

Абсолютный адрес

B

Адрес со смещением

W

Операнд памяти с косвенной адресацией через регистр

I

Константа в диапазоне от 0 до 255.

N

Константа в диапазоне от 0 до −255.

MSP430–config/msp430/constraints.md
R12

Регистр R12.

R13

Регистр R13.

K

Целочисленная константа 1.

L

Целочисленная константа -1^20..1^19.

M

Целочисленная константа 1–4.

Ya

Ссылки на память, не требующие расширенной инструкции MOVX.

Yl

Ссылка на память, только метки.

Ys

Ссылка на память, только стек.

NDS32—config/nds32/constraints.md
w

Ограничение класса младших регистров $r0–$r7 для ISA V3/V3M.

l

Класс младших регистров $r0–$r7.

d

Класс средних регистров $r0–$r11, $r16–$r19.

h

Класс старших регистров $r12–$r14, $r20–$r31.

t

Вспомогательный временный регистр $ta (то есть $r15).

k

Регистр стека $sp.

Iu03

Беззнаковое 3-битное непосредственное значение.

In03

Отрицательное 3-битное непосредственное значение в диапазоне от −7 до 0.

Iu04

Беззнаковое 4-битное непосредственное значение.

Is05

Знаковое 5-битное непосредственное значение.

Iu05

Беззнаковое 5-битное непосредственное значение.

In05

Отрицательное 5-битное непосредственное значение в диапазоне от −31 до 0.

Ip05

Беззнаковое 5-битное непосредственное значение для инструкции movpi45 в диапазоне 16–47.

Iu06

Ограничение для беззнакового 6-битного непосредственного значения инструкции addri36.sp.

Iu08

Беззнаковое 8-битное непосредственное значение.

Iu09

Беззнаковое 9-битное непосредственное значение.

Is10

Знаковое 10-битное непосредственное значение.

Is11

Знаковое 11-битное непосредственное значение.

Is15

Знаковое 15-битное непосредственное значение.

Iu15

Беззнаковое 15-битное непосредственное значение.

Ic15

Константа, не входящая в диапазон imm15u, но допустимая для инструкции bclr.

Ie15

Константа, не входящая в диапазон imm15u, но допустимая для инструкции bset.

It15

Константа, не входящая в диапазон imm15u, но допустимая для инструкции btgl.

Ii15

Константа, дополнение которой входит в диапазон imm15u и допустимо для инструкции bitci.

Is16

Знаковое 16-битное непосредственное значение.

Is17

Знаковое 17-битное непосредственное значение.

Is19

Знаковое 19-битное непосредственное значение.

Is20

Знаковое 20-битное непосредственное значение.

Ihig

Непосредственное значение, для которого можно просто установить старшие 20 бит.

Izeb

Непосредственное значение 0xff.

Izeh

Непосредственное значение 0xffff.

Ixls

Непосредственное значение 0x01.

Ix11

Непосредственное значение 0x7ff.

Ibms

Непосредственное значение, равное степени 2.

Ifex

Непосредственное значение, равное степени 2 минус 1.

U33

Ограничение памяти для формата 333.

U45

Ограничение памяти для формата 45.

U37

Ограничение памяти для формата 37.

OpenRISC—config/or1k/constraints.md
I

Целое число, допустимое в качестве непосредственного операнда инструкции, принимающей знаковое 16-битное число. Диапазон от −32768 до 32767.

K

Целое число, допустимое в качестве непосредственного операнда инструкции, принимающей беззнаковое 16-битное число. Диапазон от 0 до 65535.

M

Знаковая 16-битная константа, сдвинутая влево на 16 бит. (Используется с l.movhi)

O

Ноль

PDP-11—config/pdp11/constraints.md
a

Регистры с плавающей точкой AC0–AC3. Их можно загружать из памяти и сохранять в памяти одной инструкцией.

d

Регистры общего назначения с нечётными номерами (R1, R3, R5). Они используются для 16-битных операций умножения.

D

Ссылка на память, закодированная в коде операции, но не использующая автоинкремент или автодекремент.

f

Любой из регистров с плавающей точкой (AC0–AC5).

G

Константа с плавающей точкой 0.

h

Регистры с плавающей точкой AC4 и AC5. Их нельзя загружать из памяти или сохранять в памяти одной инструкцией.

I

Целочисленная константа, помещающаяся в 16 бит.

J

Целочисленная константа, младшие 16 бит которой равны нулю.

K

Целочисленная константа, не удовлетворяющая ограничениям для кодов ‘I’ или ‘J’.

L

Целочисленная константа 1.

M

Целочисленная константа −1.

N

Целочисленная константа 0.

O

Целочисленные константы от 0 до 3; сдвиги на эти величины выполняются как несколько однобитных сдвигов, а не как один сдвиг переменной длины.

Q

Ссылка на память, для которой после кода операции требуется дополнительное слово (адрес или смещение).

R

Ссылка на память, закодированная в коде операции.

PowerPC and IBM RS6000—config/rs6000/constraints.md
r

Регистр общего назначения (GPR), r0…r31.

b

Базовый регистр. Подобен r, но r0 не допускается, поэтому r1…r31.

f

Регистр с плавающей точкой (FPR), f0…f31.

d

Регистр с плавающей точкой. В настоящее время он совпадает с f; исторически f использовался для чисел с плавающей точкой одинарной точности, а d — для чисел двойной точности.

v

Векторный регистр Altivec (VR), v0…v31.

wa

Регистр VSX (VSR), vs0…vs63. Это либо FPR (vs0…vs31 соответствуют f0…f31), либо VR (vs32…vs63 соответствуют v0…v31).

При использовании wa следует использовать модификатор вывода %x, чтобы вывести правильный номер регистра. Например:

asm ("xvadddp %x0,%x1,%x2"
     : "=wa" (v1)
     : "wa" (v2), "wa" (v3));

Не следует использовать %x для операндов v:

asm ("xsaddqp %0,%1,%2"
     : "=v" (v1)
     : "v" (v2), "v" (v3));
c

Регистр счётчика, ctr.

l

Регистр ссылки, lr.

x

Поле 0 регистра условий, cr0.

y

Любое поле регистра условий, cr0…cr7.

I

Знаковая 16-битная константа.

J

Беззнаковая 16-битная константа, сдвинутая влево на 16 бит (для констант SImode вместо этого используйте L).

K

Беззнаковая 16-битная константа.

L

Знаковая 16-битная константа, сдвинутая влево на 16 бит.

eI

Знаковая 34-битная целочисленная константа, если поддерживаются префиксные инструкции.

eP

Скалярная константа с плавающей точкой или векторная константа, которую можно загрузить в регистр VSX одной префиксной инструкцией.

eQ

Константа IEEE шириной 128 бит, которую можно загрузить в регистр VSX инструкцией lxvkq.

m

Операнд памяти. Обычно m не допускает адреса, обновляющие базовый регистр. Если также используется ограничение < или >, такие адреса допускаются, поэтому в этом случае на целевых платформах PowerPC безопасно использовать m<> в инструкции asm только в том случае, если эта инструкция asm обращается к операнду ровно один раз. В инструкции asm также необходимо использовать %U<opno> в качестве заполнителя для флага «обновления» в соответствующей инструкции загрузки или сохранения. Например:

asm ("st%U0 %1,%0" : "=m<>" (mem) : "r" (val));

корректно, а:

asm ("st %1,%0" : "=m<>" (mem) : "r" (val));

некорректно.

Q

Операнд памяти, адресуемый только базовым регистром.

Z

Операнд памяти с индексной или косвенной адресацией.

a

Индексный или косвенный адрес.

PRU—config/pru/constraints.md
I

Беззнаковая 8-битная целочисленная константа.

J

Беззнаковая 16-битная целочисленная константа.

L

Беззнаковая 5-битная целочисленная константа (для счётчиков сдвига).

T

Константная метка сегмента текста (памяти программы).

Z

Целочисленная константа ноль.

RL78—config/rl78/constraints.md
Int3

Целочисленная константа в диапазоне от 1 до 7.

Int8

Целочисленная константа в диапазоне от 0 до 255.

J

Целочисленная константа в диапазоне от −255 до 0

K

Целочисленная константа 1.

L

Целочисленная константа -1.

M

Целочисленная константа 0.

N

Целочисленная константа 2.

O

Целочисленная константа -2.

P

Целочисленная константа в диапазоне от 1 до 15.

Qbi

Встроенные типы сравнений: eq, ne, gtu, ltu, geu и leu.

Qsc

Синтетические типы сравнений: gt, lt, ge и le.

Wab

Ссылка на память с абсолютным адресом.

Wbc

Ссылка на память, использующая BC в качестве базового регистра, с необязательным смещением.

Wca

Ссылка на память, использующая AX, BC, DE или HL в качестве адреса, для вызовов.

Wcv

Ссылка на память, использующая любую 16-битную пару регистров в качестве адреса, для вызовов.

Wd2

Ссылка на память, использующая DE в качестве базового регистра, с необязательным смещением.

Wde

Ссылка на память, использующая DE в качестве базового регистра без смещения.

Wfr

Любая ссылка на память с адресом в дальней области адресов.

Wh1

Ссылка на память, использующая HL в качестве базового регистра, с необязательным однобайтовым смещением.

Whb

Ссылка на память, использующая HL в качестве базового регистра, а B или C — в качестве индексного регистра.

Whl

Ссылка на память, использующая HL в качестве базового регистра без смещения.

Ws1

Ссылка на память, использующая SP в качестве базового регистра, с необязательным однобайтовым смещением.

Y

Любая ссылка на память с адресом в ближней области адресов.

A

Регистр AX.

B

Регистр BC.

D

Регистр DE.

R

Регистры от A до L.

S

Регистр SP.

T

Регистр HL.

Z08W

16-битный регистр R8.

Z10W

16-битный регистр R10.

Zint

Регистры, зарезервированные для прерываний (от R24 до R31).

a

Регистр A.

b

Регистр B.

c

Регистр C.

d

Регистр D.

e

Регистр E.

h

Регистр H.

l

Регистр L.

v

Виртуальные регистры.

w

Регистр PSW.

x

Регистр X.

RISC-V—config/riscv/constraints.md
f

Регистр с плавающей точкой (если доступен).

I

Знаковое 12-битное непосредственное значение типа I.

J

Целочисленный ноль.

K

Беззнаковое 5-битное непосредственное значение для инструкций доступа к CSR.

A

Адрес, хранящийся в регистре общего назначения.

S

Ограничение, соответствующее абсолютному символьному адресу.

vr

Векторный регистр (если доступен)..

vd

Векторный регистр, кроме v0 (если доступен).

vm

Только векторный регистр v0 (если доступен).

cr

Регистр общего назначения RVC (x8–x15).

cf

Регистры с плавающей точкой RVC (f8–f15), если доступны; при использовании zfinx регистры GPR повторно используются как FPR.

R

Пара регистров общего назначения с чётным и нечётным номерами.

RX—config/rx/constraints.md
Q

Адрес, не использующий косвенную адресацию через регистр или адресацию с предварительным/последующим инкрементом/декрементом.

Symbol

Ссылка на символ.

Int08

Константа в диапазоне от −256 до 255 включительно.

Sint08

Константа в диапазоне от −128 до 127 включительно.

Sint16

Константа в диапазоне от −32768 до 32767 включительно.

Sint24

Константа в диапазоне от −8388608 до 8388607 включительно.

Uint04

Константа в диапазоне от 0 до 15 включительно.

S/390 and zSeries—config/s390/s390.h
a

Регистр адреса (регистр общего назначения, кроме r0)

c

Регистр кодов условий

d

Регистр данных (произвольный регистр общего назначения)

f

Регистры с плавающей точкой

I

Беззнаковая 8-разрядная константа (0–255)

J

Беззнаковая 12-разрядная константа (0–4095)

K

Знаковая 16-разрядная константа (−32768–32767)

L

Значение, подходящее в качестве смещения.

(0..4095)

для короткого смещения

(−524288..524287)

для длинного смещения

M

Целочисленная константа со значением 0x7fffffff.

N

Ограничение из нескольких букв, за которым следуют 4 буквы параметров.

0..9:

номер части при подсчёте от старшей к младшей

H,Q:

режим части

D,S,H:

режим содержащего операнда

0,F:

значение остальных частей (F — все биты установлены)

Ограничение соответствует константе, если указанная часть константы имеет значение, отличное от значений остальных её частей.

Q

Ссылка на память без индексного регистра и с коротким смещением.

R

Ссылка на память с индексным регистром и коротким смещением.

S

Ссылка на память без индексного регистра, но с длинным смещением.

T

Ссылка на память с индексным регистром и длинным смещением.

U

Указатель с коротким смещением.

W

Указатель с длинным смещением.

Y

Операнд счётчика сдвига.

SPARC—config/sparc/sparc.h
f

Регистр с плавающей точкой в архитектуре SPARC-V8 и младший регистр с плавающей точкой в архитектуре SPARC-V9.

e

Регистр с плавающей точкой. Эквивалентен «f» в архитектуре SPARC-V8 и содержит младшие и старшие регистры с плавающей точкой в архитектуре SPARC-V9.

c

Регистр кодов условий с плавающей точкой.

d

Младший регистр с плавающей точкой. Допустим только в архитектуре SPARC-V9 при наличии набора инструкций Visual Instruction Set.

b

Регистр с плавающей точкой. Допустим только в архитектуре SPARC-V9 при наличии набора инструкций Visual Instruction Set.

h

64-разрядный глобальный регистр или регистр out для архитектуры SPARC-V8+.

C

Константа, состоящая из единиц, для чисел с плавающей точкой.

A

Знаковая 5-разрядная константа

D

Векторная константа

I

Знаковая 13-разрядная константа

J

Ноль

K

32-разрядная константа с обнулёнными младшими 12 битами (константа, которую можно загрузить инструкцией sethi)

L

Константа в диапазоне, поддерживаемом инструкциями movcc (11-разрядное знаковое непосредственное значение)

M

Константа в диапазоне, поддерживаемом инструкциями movrcc (10-разрядное знаковое непосредственное значение)

N

То же, что «K», за исключением того, что проверяется, равны ли нулю биты, не входящие в младший 32-разрядный диапазон. Для режимов шире SImode необходимо использовать это ограничение вместо «K»

O

Константа 4096

G

Ноль с плавающей точкой

H

Знаковая 13-разрядная константа с расширением знака до 32 или 64 бит

P

Константа -1

Q

Константа с плавающей точкой, целочисленное представление которой можно переместить в целочисленный регистр одной инструкцией sethi

R

Константа с плавающей точкой, целочисленное представление которой можно переместить в целочисленный регистр одной инструкцией mov

S

Константа с плавающей точкой, целочисленное представление которой можно переместить в целочисленный регистр последовательностью инструкций high/lo_sum

T

Адрес памяти, выровненный по границе 8 байт

W

Адрес памяти для регистров с ограничением «e»

w

Адрес памяти только с базовым регистром

Y

Векторный ноль

Семейство TI C6X—config/c6x/constraints.md
a

Файл регистров A (A0–A31).

b

Файл регистров B (B0–B31).

A

Предикатные регистры в файле регистров A (A0–A2 на C64X и более новых моделях, A1 и A2 в остальных случаях).

B

Предикатные регистры в файле регистров B (B0–B2).

C

Регистр файла B, используемый при вызове (B0–B9, B16–B31).

Da

Файл регистров A, за исключением предикатных регистров (A3–A31, а также A0, если это не C64X или более новая модель).

Db

Файл регистров B, за исключением предикатных регистров (B3–B31).

Iu4

Целочисленная константа в диапазоне 0 … 15.

Iu5

Целочисленная константа в диапазоне 0 … 31.

In5

Целочисленная константа в диапазоне −31 … 0.

Is5

Целочисленная константа в диапазоне −16 … 15.

I5x

Целочисленная константа, допустимая в качестве операнда инструкции ADDA или SUBA.

IuB

Целочисленная константа в диапазоне 0 … 65535.

IsB

Целочисленная константа в диапазоне −32768 … 32767.

IsC

Целочисленная константа в диапазоне -2^{20} … 2^{20} - 1.

Jc

Целочисленная константа, являющаяся допустимой маской для инструкции clr.

Js

Целочисленная константа, являющаяся допустимой маской для инструкции set.

Q

Ячейка памяти с базовым регистром A.

R

Ячейка памяти с базовым регистром B.

Z

Регистр B14 (также называемый DP).

Visium—config/visium/constraints.md
b

Регистр EAM mdb

c

Регистр EAM mdc

f

Регистр с плавающей точкой

l

Регистр общего назначения, кроме r29, r30 и r31

t

Регистр r1

u

Регистр r2

v

Регистр r3

G

Константа с плавающей точкой 0.0

J

Целочисленная константа в диапазоне 0 .. 65535 (16-разрядное непосредственное значение)

K

Целочисленная константа в диапазоне 1 .. 31 (5-разрядное непосредственное значение)

L

Целочисленная константа в диапазоне −65535 .. −1 (16-разрядное отрицательное непосредственное значение)

M

Целочисленная константа −1

O

Целочисленная константа 0

P

Целочисленная константа 32

Семейство x86—config/i386/constraints.md
R

Унаследованный регистр — один из восьми целочисленных регистров, доступных на всех процессорах i386 (a, b, c, d, si, di, bp, sp).

q

Любой регистр, доступный как rl. В 32-разрядном режиме — a, b, c и d; в 64-разрядном режиме — любой целочисленный регистр.

Q

Любой регистр, доступный как rh: a, b, c и d.

a

Регистр a.

b

Регистр b.

c

Регистр c.

d

Регистр d.

S

Регистр si.

D

Регистр di.

A

Регистры a и d. Этот класс используется для инструкций, возвращающих результаты размером в двойное слово в паре регистров ax:dx. Значения размером в одно слово будут размещены либо в ax, либо в dx. Например, на i386 следующая конструкция реализует rdtsc:

unsigned long long rdtsc (void)
{
  unsigned long long tick;
  __asm__ __volatile__("rdtsc":"=A"(tick));
  return tick;
}

В x86-64 это неверно, поскольку переменная tick может быть размещена в ax или dx. Вместо этого необходимо использовать следующий вариант:

unsigned long long rdtsc (void)
{
  unsigned int tickl, tickh;
  __asm__ __volatile__("rdtsc":"=a"(tickl),"=d"(tickh));
  return ((unsigned long long)tickh << 32)|tickl;
}
U

Целочисленные регистры, затираемые при вызове.

f

Любой регистр стека с плавающей точкой 80387.

t

Вершина стека с плавающей точкой 80387 (%st(0)).

u

Второй сверху элемент стека с плавающей точкой 80387 (%st(1)).

y

Любой регистр MMX.

x

Любой регистр SSE.

v

Любой регистр SSE, кодируемый в формате EVEX (%xmm0-%xmm31).

Yz

Первый регистр SSE (%xmm0).

I

Целочисленная константа в диапазоне 0 … 31 для 32-разрядных сдвигов.

J

Целочисленная константа в диапазоне 0 … 63 для 64-разрядных сдвигов.

K

Знаковая 8-разрядная целочисленная константа.

L

0xFF или 0xFFFF для andsi в качестве перемещения с расширением нулями.

M

0, 1, 2 или 3 (сдвиги для инструкции lea).

N

Беззнаковая 8-разрядная целочисленная константа (для инструкций in и out).

G

Стандартная константа с плавающей точкой 80387.

C

Нулевой операнд-константа SSE.

e

Знаковая 32-разрядная целочисленная константа или символьная ссылка, заведомо входящая в этот диапазон (для непосредственных операндов инструкций x86-64 с расширением знака).

We

Знаковая 32-разрядная целочисленная константа или символьная ссылка, заведомо входящая в этот диапазон (для операций преобразования с расширением знака, которым требуются непосредственные операнды, отличные от VOIDmode).

Wz

Беззнаковая 32-разрядная целочисленная константа или символьная ссылка, заведомо входящая в этот диапазон (для операций преобразования с расширением нулями, которым требуются непосредственные операнды, отличные от VOIDmode).

Wd

128-разрядная целочисленная константа, у которой и старшее, и младшее 64-разрядные слова удовлетворяют ограничению e.

Ws

Символьная ссылка или ссылка на метку. Для вывода исходного символа можно использовать модификатор %p.

Z

Беззнаковая 32-разрядная целочисленная константа или символьная ссылка, заведомо входящая в этот диапазон (для непосредственных операндов инструкций x86-64 с расширением нулями).

Tv

Адресный операнд VSIB.

Ts

Адресный операнд без сегментного регистра.

Xstormy16—config/stormy16/stormy16.h
a

Регистр r0.

b

Регистр r1.

c

Регистр r2.

d

Регистр r8.

e

Регистры от r0 до r7.

t

Регистры r0 и r1.

y

Регистр переноса.

z

Регистры r8 и r9.

I

Константа от 0 до 3 включительно.

J

Константа, в которой установлен ровно один бит.

K

Константа, в которой сброшен ровно один бит.

L

Константа от 0 до 255 включительно.

M

Константа от −255 до 0 включительно.

N

Константа от −3 до 0 включительно.

O

Константа от 1 до 4 включительно.

P

Константа от −4 до −1 включительно.

Q

Ссылка на память, являющаяся операцией помещения значения в стек.

R

Ссылка на память, являющаяся операцией извлечения значения из стека.

S

Ссылка на память, указывающая на константный адрес с известным значением.

T

Регистр, указанный Rx (пока не реализовано).

U

Константа, не входящая в диапазон от 2 до 15 включительно.

Z

Константа 0.

Xtensa—config/xtensa/constraints.md
a

32-разрядный регистр общего назначения

b

Одноразрядный логический регистр

A

40-разрядный регистр-аккумулятор MAC16

I

Знаковая 12-разрядная целочисленная константа для инструкций MOVI

J

Знаковая 8-разрядная целочисленная константа для инструкций ADDI

K

Целочисленная константа, допустимая для инструкций BccI

L

Беззнаковая константа, допустимая для инструкций BccUI

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Machine-Constraints.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API