"movlpd mytest_1(%rip),%xmm1 \n\t"
"movhpd mytest_1+8(%rip),%xmm1 \n\t"
のx86の両方がAVX 32ビットメモリ転送(vmovdqu
/vmovdqa
)にも使用することができる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'
であるので、これら2つの命令は、1 movdqu
/movdqa
に組み合わせることができます。
"vmovdqu mytest_1(%rip),%ymm1 \n\t" // 32-byte unaligned or
"vmovdqa mytest_1(%rip),%ymm1 \n\t" // for 32-byte aligned 'mytest_1'
質問の第2部について:
私はVmovdqa ymm1、mem256 source - > destinationの逆を探します。
これは両方向で機能します。 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.
このシーケンスは*決して*最適ではありません。いくつかの(非常に古い非AVXの)CPUでは、2つの8Bの負荷を行うことは、8Bで整列されているが16Bで整列されていないデータで役に立ちます。しかし、 'movlpd'で始めると、xmm1の古い値に偽の依存関係があります。一方、' movsd'は上半分をゼロにする64ビットのロードなので、結果の 'xmm1'は古い値に依存しません。 CPUがSSE1のみでSSE2をサポートしていない場合は、 'movlps'を使わなければならないかもしれませんが、' movlpd'は既にSSE2を必要としています。 –