Мануал по flat assembler - FASM - Ответ 6561846

2.1.21 Инструкции AVX

Advanced Vector Extensions

(AVX) — расширение системы команд. AVX предоставляет различные улучшения, новые инструкции и новую схему кодирования машинных кодов.

Новая схема кодирования инструкций VEX

Ширина векторных регистров SIMD увеличивается со 128 (XMM) до 256 бит (регистры YMM0 — YMM15). Существующие 128-битные SSE инструкции будут использовать младшую половину новых YMM регистров, не изменяя старшую часть. Для работы с YMM регистрами добавлены новые 256-битные AVX инструкции. В будущем возможно расширение векторных регистров SIMD до 512 или 1024 бит. Например, процессоры с архитектурой Larrabee уже имеют векторные регистры (ZMM) шириной в 512 бит, и используют для работы с ними SIMD команды с MVEX и VEX префиксами, но при этом они не поддерживают AVX.

Неразрушающие операции

Набор AVX инструкций использует трехоперандный синтаксис. Например, вместо

a

=

a

+

b

можно использовать

c

=

a

+

b

, при этом регистр a остается неизмененным. В случаях, когда значение

a

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

a

, из другого регистра или памяти.

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

Набор инструкций AVX содержит в себе аналоги 128-битных SSE инструкций для вещественных чисел. При этом, в отличие от оригиналов, сохранение 128-битного результата будет обнулять старшую половину YMM регистра. 128-битные AVX инструкции сохраняют прочие преимущества AVX, такие как новая схема кодирования, трехоперандный синтаксис и невыровненный доступ к памяти. Рекомендуется отказаться от старых SSE инструкций в пользу новых 128-битных AVX инструкций, даже если достаточно двух операндов

Новая схема кодирования

Новая схема кодирования инструкций VEX использует VEX префикс. В настоящий момент существуют два VEX префикса, длиной 2 и 3 байта. Для 2-х байтного VEX префикса первый байт равен 0xC5, для 3-х байтного 0xC4. В 64-битном режиме первый байт VEX префикса уникален. В 32-битном режиме возникает конфликт с инструкциями LES и LDS, который разрешается старшим битом второго байта, он имеет значение только в 64-битном режиме, через неподдерживаемые формы инструкций LES и LDS. Длина существующих AVX инструкций, вместе с VEX префиксом, не превышает 11 байт. В следующих версиях ожидается появление более длинных инструкций.

Также в спецификации AVX описана группа инструкций

PCLMUL

AssemblerВыделить код

1
2
3
4
5

PCLMULLQLQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 00]
PCLMULHQLQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 01]
PCLMULLQHQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 02]
PCLMULHQHQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 03]
PCLMULQDQ xmmreg,xmmrm,imm [rmi: 66 0f 3a 44 /r ib]

Применение

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

The Advanced Vector Extensions introduce instructions that are new variants of SSE instructions, with new scheme of encoding that allows extended syntax having a destination operand separate from all the source operands. It также introduces 256-bit AVX registers, which extend up the old 128-bit SSE registers. Any AVX instruction that puts some result into SSE register, puts zero bits into high portion of the AVX register containing it.

The AVX version of SSE instruction has the mnemonic obtained by prepending SSE instruction name with

v

. For any SSE arithmetic instruction which had a destination operand also being used as one of the source values, the AVX variant has a new syntax with three operands - the destination and two sources. The destination and first source can be SSE registers, and second source can be SSE register or memory. If the operation is performed on single pair of values, the remaining bits of first source SSE register are copied into the the destination register.

AssemblerВыделить код

1
2

vsubss xmm0,xmm2,xmm3 ; substract two 32-bit floats
vmulsd xmm0,xmm7,qword [esi] ; multiply two 64-bit floats

In case of packed operations, each instruction can also operate on the 256-bit data size when the AVX registers are specified instead of SSE registers, and the size of memory operand is also doubled then.

AssemblerВыделить код

| | |
| --- | --- |
| 1 | vaddps ymm1,ymm5,yword [esi] ; eight sums of 32-bit float pairs |

The instructions that operate on packed integer types (in particular the ones that earlier had been promoted from MMX to SSE) also acquired the new syntax with three operands, however they are only allowed to operate on 128-bit packed types and thus cannot use the whole AVX registers.

AssemblerВыделить код

1
2

vpavgw xmm3,xmm0,xmm2 ; average of 16-bit integers
vpslld xmm1,xmm0,1 ; shift double words left

If the SSE version of instruction had a syntax with three operands, the third one being an immediate value, the AVX version of such instruction takes four operands, with immediate remaining the last one.

AssemblerВыделить код

1
2

vshufpd ymm0,ymm1,ymm2,10010011b ; shuffle 64-bit floats
vpalignr xmm0,xmm4,xmm2,3 ; extract byte aligned value

The promotion to new syntax according to the rules described above has been applied to all the instructions from SSE extensions up to SSE4, with the exceptions described below.

vdppd

instruction has syntax extended to four operans, but it does not have a 256-bit version.

The are a few instructions, namely vsqrtpd, vsqrtps, vrcpps and vrsqrtps, which can operate on 256-bit data size, but retained the syntax with only two operands, because they use data from only one source:

AssemblerВыделить код

| | |
| --- | --- |
| 1 | vsqrtpd ymm1,ymm0 ; put square roots into other register |

In a similar way vroundpd and vroundps retained the syntax with three operands, the last one being immediate value.

AssemblerВыделить код

| | |
| --- | --- |
| 1 | vroundps ymm0,ymm1,0011b ; round toward zero |

Also some of the operations on packed integers kept their two-operand or three- operand syntax while being promoted to AVX version. In such case these instruc- tions follow exactly the same rules for operands as their SSE counterparts (since op- erations on packed integers do not have 256-bit variants in AVX extension). These include vpcmpestri, vpcmpestrm, vpcmpistri, vpcmpistrm, vphminposuw, vpshufd, vpshufhw, vpshuflw. And there are more instructions that in AVX versions keep exactly the same syntax for operands as the one from SSE, without any additional options:

vcomiss

,

vcomisd

,

vcvtss2si

,

vcvtsd2si

,

vcvttss2si

,

vcvttsd2si

,

vextractps

,

vpextrb

,

vpextrw

,

vpextrd

,

vpextrq

,

vmovd

,

vmovq

,

vmovntdqa

,

vmaskmovdqu

,

vpmovmskb

,

vpmovsxbw

,

vpmovsxbd

,

vpmovsxbq

,

vpmovsxwd

,

vpmovsxwq

,

vpmovsxdq

,

vpmovzxbw

,

vpmovzxbd

,

vpmovzxbq

,

vpmovzxwd

,

vpmovzxwq

and

vpmovzxdq

.

Вернуться к обсуждению:

Мануал по flat assembler FASM