【问题标题】:Which AVX registers should I use to avoid 3-byte VEX prefixes?我应该使用哪些 AVX 寄存器来避免 3 字节 VEX 前缀?
【发布时间】:2013-09-25 22:22:24
【问题描述】:

我目前正在为 x64 实现 Bitslice DES,我想知道如何使用以下 AVX 指令尽可能避免使用 3 字节 VEX 前缀:

vpor
vpxor
vpand
vpandn

有人告诉我应该尽可能使用 2 字节的 VEX 前缀而不是 3 字节的前缀,以使代码更小更快,但我不知道具体该怎么做。我在某处读到应该使用 xmm[0-7] 而不是 xmm[89] 和 xmm1[0-5],但我不知道哪些操作数组合会给我 2 字节 VEX 前缀而不是 3-字节的。这些指令与 2 或 3 个操作数一起使用,如下面的 sn-p 所示:

%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

【问题讨论】:

  • 参见指令集参考,2.3.5 The VEX Prefix 部分。如果您对粘贴的任何指令是否使用 3 字节 VEX 前缀感兴趣,只需将其组装并查看。
  • 提示:带源的 3 操作数指令 > xmm7 将使用 3 字节 VEX。
  • 感谢您的提示和指点!

标签: assembly 64-bit des avx yasm


【解决方案1】:

你应该坚持注册xmm0...xmm7。这也适用于通用寄存器,涉及eax,ebx...ebp 的指令编码大多数时候比使用r8d...r15d 的指令短一个字节。

【讨论】:

    【解决方案2】:

    事实证明,我只需要使用 xmm0...xmm7 作为最后一个操作数,就可以使用 2 字节 VEX 前缀对指令进行编码。

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2019-01-17
      • 2016-06-11
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2019-08-05
      • 2016-08-27
      • 1970-01-01
      相关资源
      最近更新 更多