2017-09-10 12 views
1

メモリ位置から256ビットをすぐにYMMレジスタに移動できますか? 私はXMMレジスタを埋めるためにしたい場合は、私はGCCのインラインアセンブラで使用します。メモリ位置から256ビットをすぐにYMMレジスタに移動できますか?

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

は、これは私が推測するより簡単に行うことができますか?

さらに: 同じ手順で、1ステップで4クォドワードをYmm0に合わせるかどうかを指定します。 私はVmovdqa ymm1、mem256 source - > destinationの逆を探します。

+1

このシーケンスは*決して*最適ではありません。いくつかの(非常に古い非AVXの)CPUでは、2つの8Bの負荷を行うことは、8Bで整列されているが16Bで整列されていないデータで役に立ちます。しかし、 'movlpd'で始めると、xmm1の古い値に偽の依存関係があります。一方、' movsd'は上半分をゼロにする64ビットのロードなので、結果の 'xmm1'は古い値に依存しません。 CPUがSSE1のみでSSE2をサポートしていない場合は、 'movlps'を使わなければならないかもしれませんが、' movlpd'は既にSSE2を必要としています。 –

答えて

3
"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. 
+0

非常におススメ!私はちょうどymmレジスタとSSE2技術を使って128ビット乗算を書いて試しています。多分誰かがすでにそれをしたでしょうか? – Matthias

関連する問題