現在、Intel x86プロセッサでのアセンブリプログラミングを学んでいます。
MMXとXMMレジスタの違いは何ですか?それらがどのような機能を果たし、それらの違いと類似点に関して私は非常に混乱していますか?
MMレジスターは、MMX命令セットによって使用されるレジスターであり、x86に [〜#〜] simd [〜#〜] を追加する最初の試みの1つです。それらは64ビット幅であり、実際にはx87レジスタの仮数部のエイリアスです(ただし、スタック位置のFPUトップの影響を受けません)。これは、既存のオペレーティングシステム(コンテキストスイッチのFPUスタックを既に保存している)との互換性を保つために行われましたが、MMXと浮動小数点を一緒に使用するのは簡単な作業ではありませんでした。
現在、これらは単なる歴史的な奇妙なものです。MMXはさまざまなSSE拡張機能に完全に取って代わられたため、実際にMMXを使用することはないと思います。編集:Peter Cordesがコメントで指摘しているように、まだかなりの数のMMXコードがあります。
代わりに、XMMレジスタは完全に独立したレジスタセットであり、SSEで導入され、現在でも広く使用されています。128ビット幅であり、64、32の配列として扱うことができる命令を備えています。 (整数および浮動小数点)、16または8ビット(整数のみ)の値。32ビットモードでは8個、64ビットでは16個の値があります。事実上すべての浮動小数点演算はSSE (したがって、XMMレジスタ)は64ビットモードであるため、MMXレジスタとは異なり、それらは依然として非常に重要です。
最近では、YMMおよびZMMレジスターに会うこともできます。これらはそれぞれAVX(2011)およびAVX-512(2015)命令セットで導入され、XMMレジスタを拡張します。汎用レジスタのe
およびr
拡張とは異なりません。 (rax
拡張eax
これは、ax
:ah
としてアクセスできるal
を拡張したものです)。
AVX対応プロセッサでは、XMMレジスタファイルの各レジスタは256ビットに拡張されます。 256ビットレジスタ全体はYMMx(xは0から15)と呼ばれ、新しいAVX命令で使用できます。下半分はXMMxであり、古いバージョンでも引き続き使用できますSSE=指示。
同様に、AVX-512は上記のレジスタを512ビットに拡張します。レジスタ全体はZMMx(AVX-512命令で使用可能)、下位256ビットはYMMx(AVX命令でも使用可能)、下位128ビットはXMMx(SSEでも使用可能)です。また、レジスタカウントが32に増えるため、これらのレジスタは大きくなり、数が2倍になります。