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