我可以立即将256位从内存位置移动到YMM寄存器吗?

时间:2017-09-10 16:35:45

标签: avx sse2

我可以立即将256位从内存位置移动到YMM寄存器吗? 如果我想填充xmm寄存器,我在gcc中使用inline asm:

          "movlpd mytest_1(%rip),%xmm1 \n\t"
          "movhpd mytest_1+8(%rip),%xmm1 \n\t"

我猜这会变得更容易吗?

此外: 相同的程序在1步中移动对齐或不移动4个四字到Ymm0? 我寻找Vmovdqa ymm1的反向,mem256源 - >目的地。

1 个答案:

答案 0 :(得分:3)

"movlpd mytest_1(%rip),%xmm1 \n\t"
"movhpd mytest_1+8(%rip),%xmm1 \n\t"

这两条说明可以合并为一个movdqu / movdqa,因为x86是Little Endian架构

"movdqu mytest_1(%rip),%xmm1 \n\t"    // 16-byte unaligned or
"movdqa mytest_1(%rip),%xmm1 \n\t"    // for 16-byte aligned 'mytest_1'

两者都可以用于AVX 32位内存传输(vmovdqu / vmovdqa):

"vmovdqu mytest_1(%rip),%ymm1 \n\t"   // 32-byte unaligned or
"vmovdqa mytest_1(%rip),%ymm1 \n\t"   // for 32-byte aligned 'mytest_1'

关于问题的第二部分:

  

我寻找Vmovdqa ymm1的逆转,mem256源 - >目的地。

这确实适用于两个方向,例如vmovdqa的可能说明:

VMOVDQA ymm1, ymm2/m256   RM   V/V   AVX   Move aligned packed integer values from ymm2/mem to ymm1.
VMOVDQA ymm2/m256, ymm1   MR   V/V   AVX   Move aligned packed integer values from ymm1 to ymm2/mem.