为什么vpclmulqdq的内存操作数比movdqa + pclmulqdq慢?

时间:2017-10-25 08:30:58

标签: assembly x86 sse avx micro-optimization

vpclmulqdq指令有四个操作数,pclmulqdq有三个操作数,因此我认为可以使用vpclmulqdq代替movdqa + pclmulqdq,但实验结果会变慢。

但是,当我使用vpaddd代替movdqa + paddd时,我的结果会更快。所以我对这个问题感到困惑。代码使用paddd这样的说明:

movdqa %xmm0, %xmm8          # slower
movdqa %xmm0, %xmm9
movdqa %xmm0, %xmm10
movdqa %xmm0, %xmm11
paddd (ONE),  %xmm8
paddd (TWO),  %xmm9
paddd (THREE),  %xmm10
paddd (FOUR),  %xmm11

vpaddd (ONE), %xmm0, %xmm8   # faster
vpaddd (TWO), %xmm0, %xmm9
vpaddd (THREE), %xmm0, %xmm10
vpaddd (FOUR), %xmm0, %xmm11

代码使用pclmulqdq指令,如:

movdqa %xmm15, %xmm1               # faster
pclmulqdq $0x00, (%rbp), %xmm1
aesenc 16(%r15), %xmm8
aesenc 16(%r15), %xmm9
aesenc 16(%r15), %xmm10
aesenc 16(%r15), %xmm11
movdqa %xmm14, %xmm3
pclmulqdq $0x00, 16(%rbp), %xmm3
aesenc 32(%r15), %xmm8
aesenc 32(%r15), %xmm9
aesenc 32(%r15), %xmm10
aesenc 32(%r15), %xmm11

vpclmulqdq $0x00, (%rbp), %xmm15, %xmm1   # slower
aesenc 16(%r15), %xmm8
aesenc 16(%r15), %xmm9
aesenc 16(%r15), %xmm10
aesenc 16(%r15), %xmm11
vpclmulqdq $0x00, 16(%rbp), %xmm14, %xmm3
aesenc 32(%r15), %xmm8
aesenc 32(%r15), %xmm9
aesenc 32(%r15), %xmm10
aesenc 32(%r15), %xmm11

其他问题:当我使用未对齐的数据时,如何编写pxor (%rdi), %xmm0等代码?(编辑注释:因为it's a separate question已从标题中移除而且因为那里&除了为循环的主要部分对齐指针之外,没有更好的答案。)

我的数据有16位(2字节)对齐。但有时我需要加载数据然后执行xor操作。所以我不能写这样的代码:

pxor (%rdi), %xmm8     # would segfault from misaligned %rdi
pxor 16(%rdi), %xmm9
pxor 32(%rdi), %xmm10
pxor 48(%rdi), %xmm11

我改变了我的代码,现在代码是正确的,但我认为效率可能不是很高,所以我该怎么办?

movdqu (%rdi), %xmm0
movdqu 16(%rdi), %xmm13
movdqu 32(%rdi), %xmm14
movdqu 48(%rdi), %xmm15

pxor %xmm0, %xmm8
pxor %xmm13, %xmm9
pxor %xmm14, %xmm10
pxor %xmm15, %xmm11

0 个答案:

没有答案
相关问题