Какие регистры AVX следует использовать, чтобы избежать использования 3-байтовых префиксов VEX?

В настоящее время я работаю над реализацией Bitslice DES для x64, и я хотел бы знать, как я могу избежать 3-байтовых префиксов VEX, насколько это возможно, с помощью следующих инструкций AVX:

vpor
vpxor
vpand
vpandn

Мне сказали, что я должен как можно больше использовать 2-байтовые префиксы VEX вместо 3-байтовых, чтобы код был меньше и быстрее, но я не знаю, как это сделать. Я где-то читал, что мне следует использовать xmm [0-7] вместо xmm [89] и xmm1 [0-5], но я не знаю, какие комбинации операндов дадут мне 2-байтовые префиксы VEX, а не 3- байтовые. Эти инструкции используются с 2 или 3 операндами, как показано в следующем фрагменте:

%macro sbox1 4
vmovdqa xmm7,  xmm4
vpandn  xmm4,  xmm0
vpor    xmm10, xmm5,  xmm2
vpxor   xmm13, xmm2,  xmm0
vpxor   xmm11, xmm5,  xmm7
vpxor   xmm14, xmm4,  xmm3
vpandn  xmm12, xmm13, xmm11
vpand   xmm13, xmm10
vpxor   xmm15, xmm11, xmm2
vpxor   xmm8,  xmm13, xmm3
vpandn  xmm9,  xmm14, xmm8
vpor    xmm13, xmm5
vpor    xmm5,  xmm0
vpandn  xmm8,  xmm7
vpandn  xmm15, xmm14
vpxor   xmm13, xmm15
vpor    xmm6,  xmm5,  xmm13
vpandn  xmm5,  xmm3
vpandn  xmm15, xmm9,  xmm13
vmovdqa xmm3,  xmm8 
vpxor   xmm8,  xmm6
vpxor   xmm5,  xmm3
vpand   xmm13, xmm10
vpandn  xmm4,  xmm2
vpxor   xmm2,  xmm6,  xmm14
vpxor   xmm6,  xmm10
vpandn  xmm4,  xmm2
vpxor   xmm2,  xmm4,  pnot
vpxor   xmm4,  xmm11
vpxor   xmm13, xmm2
vpor    xmm4,  xmm3
vpandn  xmm2,  xmm1,  xmm8
vpor    xmm14, xmm7
vpxor   xmm4,  xmm10
vpor    xmm9,  xmm1
vpxor   xmm2,  xmm13
vpxor   xmm4,  xmm0
vpxor   xmm13, xmm4
vpxor   xmm9,  xmm13
vpor    xmm5,  xmm12
vpxor   xmm9,  %1

vmovdqa %1,    xmm9
vpor    xmm6,  xmm5
vpor    xmm13, xmm11
vpxor   xmm6,  xmm4
vpor    xmm0,  xmm1,  xmm15
vpxor   xmm13, xmm6
vpxor   xmm2,  %3
vmovdqa %3,    xmm2
vpxor   xmm13, %2
vpand   xmm4,  xmm15
vpandn  xmm6,  xmm14
vpxor   xmm13, xmm0
vmovdqa %2,    xmm13
vpxor   xmm4,  xmm6
vpor    xmm4,  xmm1
vpxor   xmm4,  xmm5
vpxor   xmm4,  %4
vmovdqa %4,    xmm4
%endmacro

person meriken2ch    schedule 25.09.2013    source источник
comment
См. Справочник по набору команд, раздел 2.3.5 The VEX Prefix. Если вас интересует, использует ли какая-либо из вставленных инструкций 3-байтовый префикс VEX, просто соберите его и посмотрите.   -  person Jester    schedule 26.09.2013
comment
ПОДСКАЗКА: инструкции с 3 операндами с источником ›xmm7 будут использовать 3-байтовый VEX.   -  person Jester    schedule 26.09.2013
comment
Спасибо за подсказку и указатели!   -  person meriken2ch    schedule 26.09.2013


Ответы (2)


Вам следует придерживаться регистров xmm0...xmm7. Это также справедливо для регистров общего назначения, кодирование инструкций с использованием eax,ebx...ebp в большинстве случаев на один байт короче, чем инструкций с использованием r8d...r15d.

person Gunther Piez    schedule 26.09.2013

Оказалось, что мне просто нужно было использовать xmm0 ... xmm7 в качестве последнего операнда, чтобы инструкция была закодирована с 2-байтовым префиксом VEX.

person meriken2ch    schedule 12.10.2013