web-dev-qa-db-ja.com

MOVDQA命令とMOVAPSx86命令の違いは?

インテルのデータシートを探しています:インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルそして違いがわかりません

  • [〜#〜] movedqa [〜#〜]:整列されたダブルクワッドワードを移動
  • [〜#〜] moveaps [〜#〜]:整列されたパックされた単精度を移動します

Intelのデータシートでは、両方の手順について説明しています。

この命令を使用して、128ビットのメモリ位置からXMMレジスタをロードしたり、XMMレジスタの内容を128ビットのメモリ位置に格納したり、2つのXMMレジスタ間でデータを移動したりできます。

唯一の違いは次のとおりです。

整列されていないメモリ位置との間でダブルクワッドワードを移動するには、MOVDQU命令を使用します。

そして

パックされた単精度浮動小数点値をアラインされていないメモリ位置との間で移動するには、MOVUPS命令を使用します。

しかし、2つの異なる指示がある理由がわかりませんか?

それで誰かが違いを説明できますか?

28
GJ.

機能的には同じです。

一部(すべてではありません)のマイクロアーキテクチャでは、「ドメイン交差ペナルティ」によるタイミングの違いがあります。このため、データが整数SSE命令で使用されている場合は、通常movdqaを使用し、データが浮動小数点で使用されている場合はmovapsを使用する必要があります。このテーマの詳細については、Intel最適化マニュアルまたはAgner Fogの優れたマイクロアーキテクチャガイドを参照してください。これらの遅延は、ほとんどの場合、ロードやストアではなく、レジスタとレジスタの移動に関連していることに注意してください。

43
Stephen Canon