Spec-Zone.ru › GCC 7

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

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

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

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

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

w

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

I

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

J

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

K

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

L

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

M

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

N

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

S

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

Y

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

Z

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

Ush

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

Q

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

Ump

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

ARC —config/arc/constraints.md
q

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

e

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

D

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

I

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

Cal

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

K

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

L

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

CnL

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

CmL

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

M

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

O

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

P

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

H

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

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

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

k

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

l

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

t

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

w

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

y

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

z

Регистры iWMMX GR.

G

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

I

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

J

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

K

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

L

Целое число, которое удовлетворяет ограничению «I» при отрицании (двудополнительный код)

M

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

Q

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

R

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

S

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

Uv

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

Uy

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

Uq

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

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

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

a

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

d

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

w

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

e

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

b

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

q

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

t

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

x

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

y

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

z

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

I

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

J

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

K

Константа 2

L

Константа 0

M

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

N

Константа -1

O

Константа 8, 16 или 24

P

Константа 1

G

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

Q

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

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

Регистр P

d

Регистр D

z

Регистр P, измененный вызовом.

qn

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

D

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

W

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

e

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

A

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

B

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

b

Регистр I

v

Регистр B

f

Регистр M

c

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

C

Регистр CC.

t

LT0 или LT1.

k

LC0 или LC1.

u

LB0 или LB1.

x

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

y

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

w

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

Ksh

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

Kuh

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

Ks7

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

Ku7

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

Ku5

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

Ks4

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

Ks3

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

Ku3

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

Pn

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

PA

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

PB

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

M1

Константа 255.

M2

Константа 65535.

J

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

L

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

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 бита для инструкций add/sub

G

Константа с плавающей точкой, допустимая для инструкции store immediate

Epiphany—config/epiphany/constraints.md
U16

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

K

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

L

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

Cm1

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

Cl1

Левый сдвиг -1, т.е. маска бита с блоком ведущих единиц, остальные — блок нулей. Может соответствовать только при активной опции -m1reg-reg.

Cr1

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

Cal

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

Csy

Символьная константа для инструкции call/jump.

Rcs

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

Rsc

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

Rct

Класс регистра управления ядром.

Rgs

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

Rra

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

Rcc

Соответствует регистру кода условия целых чисел.

Sra

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

Cfm

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

FRV—config/frv/frv.h
a

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

b

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

c

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

d

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

e

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

f

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

h

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

l

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

q

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

t

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

u

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

v

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

w

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

x

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

z

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

A

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

B

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

C

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

G

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

I

Знаковая константа целого числа с 6 битами

J

Знаковая константа целого числа с 10 битами

L

Знаковая константа целого числа с 16 битами

M

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

N

Знаковая константа целого числа с 12 битами, которая отрицательна — т.е. в диапазоне от -2048 до -1

O

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

P

Знаковая константа целого числа с 12 битами, которая больше нуля — т.е. в диапазоне от 1 до 2047.

FT32—config/ft32/constraints.md
A

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

B

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

W

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

e

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

f

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

O

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

I

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

w

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

x

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

L

Беззнаковая константа целого числа с 16 битами, кратная 4 (0…65532)

S

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

b

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

KA

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

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

Общий регистр 1

f

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

q

Регистр смещения

x

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

y

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

Z

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

I

Знаковая 11-битная константа целого числа

J

Знаковая 14-битная константа целого числа

K

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

L

Знаковая 5-битная константа целого числа

M

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

N

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

O

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

P

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

S

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

U

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

G

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

A

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

Q

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

R

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

T

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

W

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

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

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

b

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

c

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

d

Регистр приложения, расположенный в блоке M

e

Регистр приложения, расположенный в блоке I

f

Регистр с плавающей запятой

m

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

G

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

I

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

J

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

K

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

L

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

M

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

N

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

O

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

P

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

Q

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

R

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

S

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

M32C—config/m32c/m32c.c
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

Общие режимы адресации памяти src/dest.

Sa

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

Si

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

Ss

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

Sf

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

Ss

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

S1

$r1h

MicroBlaze—config/microblaze/constraints.md
d

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

z

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

MIPS—config/mips/constraints.md
d

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

f

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

h

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

l

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

x

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

c

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

v

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

y

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

z

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

I

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

J

Целое ноль.

K

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

L

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

M

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

N

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

O

Знакопеременная 15-битная константа.

P

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

G

Ноль с плавающей запятой.

R

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

ZC

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

ZD

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

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

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

d

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

f

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

I

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

J

16-битное знакопеременное число

K

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

L

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

M

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

N

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

O

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

P

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

R

Числа, которые mov3q может обработать

G

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

S

Операции, которые удовлетворяют ’m’, когда -mpcrel активен

T

Операции, которые удовлетворяют ’s’, когда -mpcrel неактивен

Q

Режим адресации косвенного доступа к регистру

U

Регистровое смещение адресации

W

const_call_operand

Cs

symbol_ref или const

Ci

const_int

C0

const_int 0

Cj

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

Cmvq

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

Capsw

Целые числа, допустимые для moveq, за которым следует swap

Cmvz

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

Cmvs

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

Ap

push_operand

Ac

Операции, не являющиеся регистрами, разрешенные в clr

Moxie—config/moxie/constraints.md
A

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

B

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

W

Операнд памяти с косвенным доступом к регистру

I

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

N

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

MSP430—config/msp430/constraints.md
R12

Регистр R12.

R13

Регистр R13.

K

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

L

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

M

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

Ya

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

Yl

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

Ys

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

NDS32—config/nds32/constraints.md
w

Класс регистров LOW $r0 до $r7 для ISA V3/V3M.

l

Класс регистров LOW $r0 до $r7.

d

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

h

Класс регистров HIGH $r12 до $r14, $r20 до $r31.

t

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

k

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

Iu03

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

In03

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

Iu04

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

Is05

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

Iu05

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

In05

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

Ip05

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

Iu06

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

Iu08

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

Iu09

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

Is10

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

Is11

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

Is15

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

Iu15

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

Ic15

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

Ie15

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

It15

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

Ii15

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

Is16

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

Is17

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

Is19

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

Is20

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

Ihig

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

Izeb

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

Izeh

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

Ixls

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

Ix11

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

Ibms

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

Ifex

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

U33

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

U45

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

U37

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

Nios II family—config/nios2/constraints.md
I

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

J

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

K

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

L

Целое число, допустимое в качестве непосредственного операнда для инструкции сдвига. Диапазон от 0 до 31.

M

Целое число, допустимое в качестве непосредственного операнда только для значения 0. Может использоваться в сочетании с модификатором формата z, чтобы использовать r0 вместо 0 в выходных данных ассемблера.

N

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

P

Непосредственный операнд для инструкций R2 andchi/andci.

S

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

U

Совпадение с константами, подходящими в качестве операнда для инструкций rdprs и cache.

v

Операнд памяти, подходящий для инструкций Nios II R2 исключительной загрузки/хранения.

w

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

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

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

d

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

f

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

G

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

I

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

J

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

K

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

L

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

M

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

N

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

O

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

Q

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

R

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

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

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

d

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

f

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

v

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

wa

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

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

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

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

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

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

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

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

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

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

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

wb

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

wd

Регистр VSX вектора для хранения вещественных данных double или NO_REGS.

we

Регистр VSX, если были использованы параметры -mcpu=power9 и -m64 или NO_REGS.

wf

Регистр VSX вектора для хранения вещественных данных float или NO_REGS.

wg

Если был использован -mmfpgpr, регистр с плавающей запятой или NO_REGS.

wh

Регистр с плавающей запятой, если доступны прямые перемещения, или NO_REGS.

wi

Регистр FP или VSX для хранения 64-битовых целых чисел для инструкций VSX или NO_REGS.

wj

Регистр FP или VSX для хранения 64-битовых целых чисел для прямых перемещений или NO_REGS.

wk

Регистр FP или VSX для хранения 64-битовых чисел double для прямых перемещений или NO_REGS.

wl

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

wm

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

wn

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

wo

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

wp

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

wq

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

wr

Регистр общего назначения, если включены 64-битные инструкции или NO_REGS.

ws

Регистр VSX вектора для хранения скалярных значений double или NO_REGS.

wt

Регистр VSX вектора для хранения 128-битовых целых чисел или NO_REGS.

wu

Регистр Altivec для использования с загрузкой/сохранением float/32-битных целых чисел или NO_REGS.

wv

Регистр Altivec для использования с загрузкой/сохранением чисел double или NO_REGS.

ww

Регистр FP или VSX для выполнения операций с плавающей запятой при использовании -mvsx или NO_REGS.

wx

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

wy

Регистр FP или VSX для выполнения операций с плавающей запятой ISA 2.07 или NO_REGS.

wz

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

wA

Базовый регистр адреса, если включены 64-битные инструкции или NO_REGS.

wB

Целое число со знаком, 5-битовое константа, которое может быть загружено в регистр Altivec.

wD

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

wE

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

wF

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

wG

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

wH

Регистр Altivec, если используется -mvsx-small-integer.

wI

Регистр с плавающей запятой, если используется -mvsx-small-integer.

wJ

Регистр FP, если используются -mvsx-small-integer и -mpower9-vector.

wK

Регистр Altivec, если используются -mvsx-small-integer и -mpower9-vector.

wL

Целая константа, являющаяся номером элемента, на который нацелена инструкция MFVSRLD.

wM

Векторная константа, состоящая из единиц, если доступна инструкция XXLORC.

wO

Операнд памяти, подходящий для векторных инструкций ISA 3.0 в формате d.

wQ

Адрес памяти, который будет работать с инструкциями lq и stq.

wS

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

h

Регистр ‘MQ’, ‘CTR’ или ‘LINK’

c

Регистр ‘CTR’

l

Регистр ‘LINK’

x

Регистр ‘CR’ (регистр условия) номер 0

y

Регистр ‘CR’ (регистр условия)

z

Битовая перенос ‘XER[CA]’ (часть регистра XER)

I

16-битовая константа со знаком

J

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

K

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

L

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

M

Константа больше 31

N

Точная степень двойки

O

Ноль

P

Константа, отрицание которой является 16-битовой константой со знаком

G

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

H

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

m

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

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

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

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

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

es

«Стабильный» операнд памяти; то есть тот, который не включает автоматическое изменение базового регистра. Это раньше было полезно, когда ‘m’ допускало автоматическое изменение базового регистра, но так как теперь это разрешено только когда используются ‘<’ или ‘>’, ‘es’ по существу такое же, как ‘m’ без ‘<’ и ‘>’.

Q

Операнд памяти, представляющий собой смещение от регистра (лучше использовать ‘m’ или ‘es’ в инструкциях asm).

Z

Операнд памяти, являющийся индексированным или косвенным из регистра (лучше использовать ‘m’ или ‘es’ в инструкциях asm).

R

Запись TOC AIX

a

Операнд адреса, который является индексированным или косвенным из регистра (‘p’ предпочтительнее в инструкциях asm).

U

Ссылка на область данных небольшого размера System V Release 4

W

Векторная константа, которая не требует памяти

j

Векторная константа, состоящая из нулей.

RL78—config/rl78/constraints.md
Int3

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

Int8

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

J

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

K

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

L

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

M

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

N

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

O

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

P

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

Qbi

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

Qsc

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

Wab

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

Wbc

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

Wca

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

Wcv

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

Wd2

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

Wde

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

Wfr

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

Wh1

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

Whb

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

Whl

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

Ws1

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

Y

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

A

Регистр AX.

B

Регистр BC.

D

Регистр DE.

R

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

S

Регистр SP.

T

Регистр HL.

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-битная величина со знаком.

J

Целое ноль.

K

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

A

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

RX—config/rx/constraints.md
Q

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

Symbol

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

Int08

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

Sint08

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

Sint16

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

Sint24

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

Uint04

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

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

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

c

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

d

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

f

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

I

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

J

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

K

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

L

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

(0..4095)

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

(-524288..524287)

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

M

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

N

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

0..9:

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

H,Q:

режим части

D,S,H:

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

0,F:

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

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

Q

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

R

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

S

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

T

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

U

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

W

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

Y

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

SPARC—config/sparc/sparc.h
f

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

e

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

c

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

d

Нижний регистр с плавающей точкой. Действителен только на архитектуре SPARC-V9, когда доступен набор визуальных инструкций.

b

Регистр с плавающей точкой. Действителен только на архитектуре SPARC-V9, когда доступен набор визуальных инструкций.

h

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

C

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

A

5-битная константа со знаком.

D

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

I

13-битная константа со знаком.

J

Ноль.

K

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

L

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

M

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

movrcc

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

N

Константа 4096.

SImode

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

O

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

G

Константа -1.

H

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

P

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

Q

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

R

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

S

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

T

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

U

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

W

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

SPU—config/spu/spu.h
a

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

c

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

d

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

f

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

A

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

B

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

C

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

D

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

I

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

J

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

K

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

M

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

N

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

O

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

P

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

R

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

S

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

T

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

U

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

W

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

Y

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

Z

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

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

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

b

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

A

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

B

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

C

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

Da

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

Db

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

Iu4

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

Iu5

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

In5

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

Is5

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

I5x

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

IuB

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

IsB

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

IsC

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

Jc

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

Js

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

Q

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

R

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

Z

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

TILE-Gx—config/tilegx/constraints.md
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 или ссылки по относительному смещению.

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 или ссылки по относительному смещению.

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

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

q

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

Q

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

a

Регистр a.

b

Регистр b.

c

Регистр c.

d

Регистр d.

S

Регистр si.

D

Регистр di.

A

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

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

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

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

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

t

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

u

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

y

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

x

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

Yz

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

I

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

J

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

K

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

L

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

M

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

N

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

G

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

C

Операнд константы SSE, равный нулю.

e

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

Z

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

Xstormy16—config/stormy16/stormy16.h
a

Регистр r0.

b

Регистр r1.

c

Регистр r2.

d

Регистр r8.

e

Регистры r0–r7.

t

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

y

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

z

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

I

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

J

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

K

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

L

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

M

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

N

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

O

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

P

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

Q

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

R

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

S

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

T

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

U

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

Z

Константа 0.

Xtensa—config/xtensa/constraints.md
a

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

b

Однобитный регистр булевых значений

A

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

I

Целочисленная константа со знаком 12 бит для использования в инструкциях MOVI

J

Целочисленная константа со знаком 8 бит для использования в инструкциях ADDI

K

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

L

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

Предыдущий: Модификаторы, Вернуться к: Ограничения [Содержание][Индекс]

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

Spec-Zone.ru

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