Spec-Zone.ru › GCC 6

6.44.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 псевдоинструкции. MOV может быть ассемблирована в одну из нескольких разных машинных инструкций в зависимости от значения

N

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

S

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

Y

Константа плавающей запятой ноль

Z

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

Ush

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

Q

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

Ump

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

ARC —config/arc/constraints.md
q

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

e

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

D

Регистры ARC FPX (dpfp) 64 бит. D0, D1.

I

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

Cal

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

K

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

L

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

CnL

Однодополнительный код константы без знака, 6 бит.

CmL

Двудополнительный код константы без знака, 6 бит.

M

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

O

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

P

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

H

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

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

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

k

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

l

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

t

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

w

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

y

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

z

Регистры GR iWMMX.

G

Константа плавающей запятой 0,0.

I

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

J

Целое число от -4095 до 4095.

K

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

L

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

M

Целое число от 0 до 32.

Q

Ссылка на память, где точный адрес находится в одном регистре (‘‘m’’ предпочтительнее для asm операторов)

R

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

S

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

Uv

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

Uy

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

Uq

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

AVR —config/avr/constraints.md
l

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

a

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

d

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

w

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

e

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

b

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

q

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

t

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

x

Регистровая пара X (r27:r26)

y

Регистровая пара Y (r29:r28)

z

Регистровая пара Z (r31:r30)

I

Константа больше -1, меньше 64

J

Константа больше -64, меньше 1

K

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

L

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

M

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

N

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

O

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

P

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

G

Константа плавающей запятой 0,0

Q

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

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

Регистр P

d

Регистр D

z

Вызов функции, изменивший регистр P.

qn

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

D

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

W

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

e

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

A

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

B

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

b

Регистр I

v

Регистр B

f

Регистр M

c

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

C

Регистр CC.

t

LT0 или LT1.

k

LC0 или LC1.

u

LB0 или LB1.

x

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

y

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

w

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

Ksh

Целое число со знаком 16 бит (в диапазоне от -32768 до 32767)

Kuh

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

Ks7

Целое число со знаком 7 бит (в диапазоне от -64 до 63)

Ku7

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

Ku5

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

Ks4

Целое число со знаком 4 бит (в диапазоне от -8 до 7)

Ks3

Целое число со знаком 3 бит (в диапазоне от -3 до 4)

Ku3

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

Pn

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

PA

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

PB

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

M1

Константа 255.

M2

Константа 65535.

J

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

L

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

H
Q

Любой 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 бита для инструкций сложения/вычитания

G

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

Epiphany—config/epiphany/constraints.md
U16

Константа без знака 16 бит.

K

Константа без знака 5 бит.

L

Константа со знаком 11 бит.

Cm1

Константа со знаком 11 бит, добавленная к -1. Может совпадать только при активном параметре -m1reg-reg.

Cl1

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

Cr1

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

Cal

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

Csy

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

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

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

I

Шестибитная константа со знаком.

J

Десятибитная константа со знаком.

L

Шестнадцатибитная константа со знаком.

M

Шестнадцатибитная константа без знака.

N

Двенадцатибитная константа со знаком, отрицательная (от -2048 до -1).

O

Константа ноль.

P

Двенадцатибитная константа со знаком, положительная (от 1 до 2047).

FT32—config/ft32/constraints.md
A

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

B

Смещение адреса

W

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

e

Смещение адреса.

f

Смещение адреса.

O

Константа ноль или единица

I

16-битная целая константа со знаком (-32768 … 32767)

w

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

x

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

L

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

S

20-битная целая константа со знаком (-524288 … 524287)

b

Константа для ширины битового поля (1 … 16)

KA

10-битная целая константа со знаком (-512 … 511)

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

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

f

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

q

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

x

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

y

Регистр с плавающей точкой (верхний, 32 бита), регистр с плавающей точкой (64 бита)

Z

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

I

Целая 11-битная константа со знаком

J

Целая 14-битная константа со знаком

K

Целая константа, которая может быть размещена с помощью инструкции zdepi

L

Целая 5-битная константа со знаком

M

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

N

Целая константа, которая может быть загружена с помощью инструкции ldil

O

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

P

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

S

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

U

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

G

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

A

Операнд памяти таблицы связывания данных lo_sum

Q

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

R

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

T

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

W

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

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

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

b

Регистр ветвления

c

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

d

Регистр приложения, находящийся в блоке М

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
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

MeP—config/mep/constraints.md
a

Регистр $sp.

b

Регистр $tp.

c

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

d

Либо регистр $hi, либо регистр $lo.

em

Регистры сопроцессора, которые можно напрямую загружать ($c0-$c15).

ex

Регистры сопроцессора, которые можно перемещать друг в друга.

er

Регистры сопроцессора, которые можно перемещать в ядровые регистры.

h

Регистр $hi.

j

Регистр $rpc.

l

Регистр $lo.

t

Регистры, которые можно использовать в адресовании, относительном к $tp.

v

Регистр $gp.

x

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

y

Регистры управления сопроцессора.

z

Регистр $0.

A

Набор пользовательских регистров A.

B

Набор пользовательских регистров B.

C

Набор пользовательских регистров C.

D

Набор пользовательских регистров D.

I

Смещения для адресации, относительной к $gp.

J

Константы, которые можно напрямую использовать с логическими инструкциями.

K

Константы, которые можно напрямую переместить в регистры.

L

Небольшие константы, которые можно добавить к регистрам.

M

Длинные сдвиги.

N

Небольшие константы, которые можно сравнить с регистрами.

O

Константы, которые можно загрузить в старшую половину регистров.

S

Целочисленные 8-битные непосредственные значения со знаком.

T

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

U

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

W

Старшая половина значения символа.

Y

Адрес косвенного обращения к регистру без смещения.

Z

Символические ссылки на шину управления.

MicroBlaze—config/microblaze/constraints.md
d

Общий регистр (от r0 до r31).

z

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

MIPS—config/mips/constraints.md
d

Регистр адреса. Эквивалентен r, за исключением генерации кода 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, поворот:SI от 8 до 1, представлен как поворот

O

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

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

Ограничение для класса регистров низкого уровня $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

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

Ifex

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

U33

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

U45

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

U37

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

Семейство Nios II—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 бит равны нулю.

K

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

L

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

M

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

N

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

O

Целые константы от -4 до -1 и от 1 до 4; сдвиги на эти значения обрабатываются как несколько сдвигов на один бит, а не как один сдвиг переменной длины.

Q

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

R

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

PowerPC и IBM RS6000—config/rs6000/constraints.md
b

Базовый регистр адреса

d

Регистр с плавающей запятой (содержит 64-битное значение)

f

Регистр с плавающей запятой (содержит 32-битное значение)

v

Регистр вектора Altivec

wa

Любой регистр VSX, если использовался параметр -mvsx или NO_REGS.

При использовании ограничений регистров (wa, wd, wf, wg, wh, wi, wj, wk, wl, wm, wo, wp, wq, ws, wt, wu, wv, ww, или wy), которые принимают регистры VSX, необходимо использовать %x<n> в шаблоне, чтобы использовать правильный регистр. В противном случае номер регистра в файле ассемблера будет неверным, если регистр Altivec является операндом инструкции VSX, которая ожидает нумерацию регистров VSX.

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

правильно, но:

asm ("xvadddp %0,%1,%2" : "=wa" (v1) : "wa" (v2), "wa" (v3));

неправильно.

Если инструкция принимает только регистры Altivec, не нужно использовать %x<n>.

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

правильно, потому что инструкция xsaddqp принимает только регистры Altivec, в то время как:

asm ("xsaddqp %x0,%x1,%x2" : "=v" (v1) : "v" (v2), "v" (v3));

неправильно.

wb

Регистр вектора Altivec, если используется -mcpu=power9 или NO_REGS.

wd

Регистр вектора VSX для хранения векторизованных данных 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-битных чисел с плавающей запятой для прямых перемещений или NO_REGS.

wl

Регистр с плавающей запятой, если включена инструкция LFIWAX или NO_REGS.

wm

Регистр VSX, если включены инструкции прямого перемещения, или NO_REGS.

wn

Никакой регистр (NO_REGS).

wo

Регистр VSX для использования с векторными инструкциями ISA 3.0 или NO_REGS.

wp

Регистр VSX для использования с плавающей запятой IEEE 128-бит TFmode или NO_REGS.

wq

Регистр VSX для использования с плавающей запятой IEEE 128-бит или 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.

wD

Целочисленная константа, являющаяся номером элемента 64-битного скаляра в векторе.

wE

Векторная константа, которую можно загрузить с помощью инструкции XXSPLTIB.

wF

Операнд памяти, подходящий для слияния загрузки/сохранения power9.

wG

Операнд памяти, подходящий для слияния ссылок в TOC памяти.

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

Запись AIX TOC

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.

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.

RX—config/rx/constraints.md
Q

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

Symbol

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

Int08

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

Sint08

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

Sint16

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

Sint24

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

Uint04

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

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

Регистр адреса (общий регистр, кроме r0).

c

Регистр кода условия.

d

Регистр данных (любой общий регистр).

f

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

I

Беззнаковая 8-битная константа (0–255).

J

Беззнаковая 12-битная константа (0–4095).

K

Знаковая 16-битная константа (-32768–32767).

L

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

(0..4095)

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

(-524288..524287)

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

M

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

N

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

0..9:

номер части, считая с самой старшей к самой младшей

H,Q:

режим части

D,S,H:

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

0,F:

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

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

Q

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

R

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

S

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

T

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

U

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

W

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

Y

Операнд сдвига.

SPARC—config/sparc/sparc.h
f

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

e

Регистр с плавающей точкой. Он эквивалентен ‘f’ на архитектуре SPARC-V8 и содержит как нижний, так и верхний регистры с плавающей точкой на архитектуре SPARC-V9.

c

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

d

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

b

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

h

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

C

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

A

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

D

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

I

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

J

Ноль

K

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

L

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

M

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

N

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

O

Константа 4096

G

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

H

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

P

Константа -1

Q

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

R

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

S

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

T

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

U

Четный регистр.

W

Адрес памяти для регистров ограничения ‘e’.

w

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

Y

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

SPU—config/spu/spu.h
a

Непосредственное значение, которое можно загрузить с помощью инструкций il/ila/ilh/ilhu. const_int обрабатывается как 64-битовое значение.

c

Непосредственное значение для инструкций and/xor/or. const_int обрабатывается как 64-битовое значение.

d

Непосредственное значение для инструкции iohl. const_int обрабатывается как 64-битовое значение.

f

Непосредственное значение, которое можно загрузить с помощью fsmbi.

A

Непосредственное значение, которое можно загрузить с помощью инструкций il/ila/ilh/ilhu. const_int обрабатывается как 32-битовое значение.

B

Непосредственное значение для большинства арифметических инструкций. const_int обрабатывается как 32-битовое значение.

C

Непосредственное значение для инструкций and/xor/or. const_int обрабатывается как 32-битовое значение.

D

Непосредственное значение для инструкции iohl. const_int обрабатывается как 32-битовое значение.

I

Константа в диапазоне [-64, 63] для инструкций сдвига/вращения.

J

Беззнаковая 7-битовая константа для инструкций преобразования/nop/канала.

K

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

M

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

N

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

O

Беззнаковая 7-битовая константа, три младших бита которой равны 0.

P

Беззнаковая 3-битовая константа для 16-байтовых вращений и сдвигов

R

Операнд вызова, reg, для косвенных вызовов

S

Операнд вызова, символ, для относительных вызовов.

T

Операнд вызова, const_int, для абсолютных вызовов.

U

Непосредственное значение, которое можно загрузить с помощью инструкций il/ila/ilh/ilhu. const_int расширяется со знаком до 128 бит.

W

Непосредственное значение для инструкций сдвига и вращения. const_int обрабатывается как 32-битовое значение.

Y

Непосредственное значение для инструкций and/xor/or. const_int расширяется со знаком до 128 бит.

Z

Непосредственное значение для инструкции iohl. const_int расширяется со знаком до 128 бит.

TI C6X family—config/c6x/constraints.md
a

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

b

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

A

Регистры-предикаты в регистровом файле A (A0–A2 в C64X и выше, иначе A1 и A2).

B

Регистры-предикаты в регистровом файле B (B0–B2).

C

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

Da

Регистровый файл A, за исключением регистров-предикатов (A3–A31, плюс A0, если это не C64X или выше).

Db

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

Iu4

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

Iu5

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

In5

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

Is5

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

I5x

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

IuB

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

IsB

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

IsC

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

Jc

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

Js

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

Q

Местоположение памяти с базовым регистром A.

R

Местоположение памяти с базовым регистром B.

Z

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

TILE-Gx—config/tilegx/constraints.md
R00
R01
R02
R03
R04
R05
R06
R07
R08
R09
R10

Каждый из них представляет ограничение регистра для отдельного регистра от r0 до r10.

I

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

J

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

K

Целочисленная константа без знака, 16 бит.

L

Целочисленная константа, которая помещается в один байт со знаком, при увеличении на единицу (-129 … 126).

m

Операнд памяти. Если используется вместе с ‘<’ или ‘>’, операнд может иметь пост-инкремент, который требует вывода с ‘%In’ и ‘%in’ на TILE-Gx. Например:

asm ("st_add %I0,%1,%i0" : "=m<>" (*mem) : "r" (val));
M

Маска битов, подходящая для инструкции BFINS.

N

Целочисленная константа, которая является байтом, выложенным восемь раз.

O

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

P

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

Q

Целочисленная константа, которая помещается в один байт со знаком, при увеличении (-129 … 126), но не включая -1.

S

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

T

16-битный фрагмент got, tls или pc-относительной ссылки.

U

Операнд памяти, за исключением пост-инкремента. Это примерно то же самое, что ‘m’, когда не используется вместе с ‘<’ или ‘>’.

W

8-элементный векторный константный, с идентичными элементами.

Y

4-элементный векторный константный, с идентичными элементами.

Z0

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

Z1

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

TILEPro—config/tilepro/constraints.md
R00
R01
R02
R03
R04
R05
R06
R07
R08
R09
R10

Каждый из них представляет ограничение регистра для отдельного регистра от r0 до r10.

I

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

J

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

K

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

L

Целочисленная константа, которая помещается в один байт со знаком, при увеличении на единицу (-129 … 126).

m

Операнд памяти. Если используется вместе с ‘<’ или ‘>’, операнд может иметь пост-инкремент, который требует вывода с ‘%In’ и ‘%in’ на TILEPro. Например:

asm ("swadd %I0,%1,%i0" : "=m<>" (mem) : "r" (val));
M

Маска битов, подходящая для инструкции MM.

N

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

O

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

P

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

Q

Целочисленная константа, которая помещается в один байт со знаком, при увеличении (-129 … 126), но не включая -1.

T

Символический операнд или 16-битный фрагмент got, tls или pc-относительной ссылки.

U

Операнд памяти, за исключением пост-инкремента. Это примерно то же самое, что ‘m’, когда не используется вместе с ‘<’ или ‘>’.

W

4-элементный векторный константный, с идентичными элементами.

Y

2-элементный векторный константный, с идентичными элементами.

Visium—config/visium/constraints.md
b

Регистр EAM mdb

c

Регистр EAM mdc

f

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

l

Общий регистр, но не r29, r30 и r31

t

Регистр r1

u

Регистр r2

v

Регистр r3

G

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

J

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

K

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

L

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

M

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

O

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

P

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

x86 family—config/i386/constraints.md
R

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

q

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

Q

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

a

Регистр a.

b

Регистр b.

c

Регистр c.

d

Регистр d.

S

Регистр si.

D

Регистр di.

A

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

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

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

unsigned long long rdtsc (void)
{
  unsigned int tickl, tickh;
  __asm__ __volatile__("rdtsc":"=a"(tickl),"=d"(tickh));
  return ((unsigned long long)tickh << 32)|tickl;
}
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

Регистр булевых значений, 1 бит

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-6.5.0/gcc/Machine-Constraints.html

Spec-Zone.ru

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