MMX 命令

移動
MOVD
MOVQ
32/64bit 値の移動
MOVDQ2QXMM → MMX レジスタの移動
MOVQ2DQMMX → XMM レジスタに移動
MOVNTQ非テンポラルなメモリ移動
MASKMOVQマスクありの移動
PMOVMSKBパック BYTE の最上位ビットを移動
PSHUFWパック WORD を指定位置に移動
演算
PADDBパック BYTE 加算
PADDSBパック BYTE 加算 (符号付き・飽和)
PADDUSBパック BYTE 加算 (符号なし・飽和)
PADDWパック WORD 加算
PADDSWパック WORD 加算 (符号付き・飽和)
PADDUSWパック WORD 加算 (符号なし・飽和)
PADDDパック DWORD 加算
PADDQQWORD 加算
PSUBBパック BYTE 減算
PSUBUSBパック BYTE 減算 (符号なし・飽和)
PSUBSBパック BYTE 減算 (符号付き・飽和)
PSUBWパック WORD 減算
PSUBUSWパック WORD 減算 (符号なし・飽和)
PSUBSWパック WORD 減算 (符号付き・飽和)
PSUBDパック DWORD 減算
PSUBQQWORD 減算
PMULLWパック WORD 乗算 (符号付き・下位16bit)
PMULHWパック WORD 乗算 (符号付き・上位16bit)
PMULHUWパック WORD 乗算 (符号なし・上位16bit)
PMADDWDパック WORD の乗算と DWORD の加算
PMULUDQ符号なし DWORD 乗算
PAVGBパック BYTE (符号なし) 平均値
PAVGWパック WORD (符号なし) 平均値
PSADBWバイトの絶対差分の合計をワードにパック
論理演算
PANDAND
PANDNNOT AND
POROR
PXORXOR
ビット操作
PSLLWパック WORD を左シフト
PSLLDパック DWORD を左シフト
PSLLQQWORD を左シフト
PSRAWパック WORD 右シフト (符号付き)
PSRADパック DWORD 右シフト (符号付き)
PSRLWパック WORD 右シフト (符号なし)
PSRLDパック DWORD 右シフト (符号なし)
PSRLQQWORD 右シフト (符号なし)
比較
PCMPEQBパック BYTE が等しいか比較
PCMPEQWパック WORD が等しいか比較
PCMPEQDパック DWORD が等しいか比較
PCMPGTBパック BYTE 比較 (符号付き・大きい)
PCMPGTWパック WORD 比較 (符号付き・大きい)
PCMPGTDパック DWORD 比較 (符号付き・大きい)
最大値/最小値
PMINUBパック BYTE 最小値 (符号なし)
PMINSWパック WORD 最小値 (符号付き)
PMAXUBパック BYTE 最大値 (符号なし)
PMAXSWパック WORD 最大値 (符号付き)
パック
PACKUSWB符号付き WORD→符号なし BYTE (飽和)
PACKSSWB符号付き WORD→BYTE のパック (飽和)
PACKSSDW符号付き DWORD→WORD のパック (飽和)
アンパック
PUNPCKLBW下位のバイトのアンパック
PUNPCKHBW上位のバイトのアンパック
PUNPCKLWD下位の WORD のアンパック
PUNPCKHWD上位の WORD のアンパック
PUNPCKLDQ下位の DWORD のアンパック
PUNPCKHDQ上位の DWORD のアンパック
パック抽出/挿入
PEXTRWパック WORD の抽出
PINSRWパック WORD に挿入
状態
EMMSMMX 状態をクリアする
FXSAVEXMM,MMX,x87 状態の保存
FXRSTORXMM,MMX,x87 状態の復元
移動
MOVD mmx, reg/mem32 | 0F 6E /r
MOVD reg/mem32, mmx | 0F 7E /r

MOVQ mmx, reg/mem64 | 0F 6E /r
MOVQ reg/mem64, mmx | 0F 7E /r

MOVQ mmx1, mmx2/mem64 | 0F 6F /r
MOVQ mmx1/mem64, mmx2 | 0F 7F /r
MMX レジスタと、汎用レジスタ/メモリ間の移動 (32bit or 64bit)。
MMX レジスタと、MMX レジスタ/メモリ間の移動 (64bit)。

32bit 値を MMX レジスタにコピーする場合、ゼロ拡張されます。
MOVDQ2Q mmx, xmm | F2 0F D6 /r
XMM レジスタの下位 64bit 値を、MMX レジスタに移動します。

[SSE2]
MOVQ2DQ xmm, mmx | F3 0F D6 /r
MMX レジスタから、XMM レジスタの下位 64bit に、128bit ゼロ拡張して移動します。

[SSE2]
MOVNTQ mem64, mmx | 0F E7 /r
MMX レジスタ値を、64bit メモリ位置に保存します。

この命令は、データが非一時的であり、すぐに再び使用される可能性が低いことを、プロセッサに示します。
プロセッサは、ストアを書き込み結合 (WC) メモリ書き込みとして処理するため、キャッシュ汚染が最小限に抑えられます。

[SSE1]
MASKMOVQ mmx1, mmx2 | 0F F7 /r
第2オペランドで選択された、第1オペランドのバイトを、DS:rDI レジスタで指定されたメモリに格納します (64bit モードでは DS は無視されます)。

第1オペランドは MMX レジスタで、第2オペランドは別の MMX レジスタです。
第2オペランドの各バイトの最上位ビットは、第1オペランドの対応するバイトのストア (1 = ストア、0 = ストアなし) を指定します。

選択されていない要素の、例外とトラップの動作は、実装に依存します。
たとえば、特定の実装では、実際には書き込まれていないバイトに対して、データブレークポイントまたはページフォールトを通知する場合があります。

[SSE1]
PMOVMSKB reg32, mmx | 0F D7 /r
第2オペランドの8つのバイトの最上位ビットから、8bit 値を形成し、第1オペランドの下位 8bit に移動します。
宛先オペランドの上位 24bit は 0 にクリアされます。

[SSE2]
PSHUFW mmx1, mmx2/mem64, imm8 | 0F 70 /r ib
第2オペランド内の4つの WORD を、それぞれ指定された位置で、第1オペランドに移動します。

即値オペランドの 2bit x 4 の値で、第1オペランドの対応する位置のワードを、ソースのどの位置からコピーするかを指定できます。
ソースの位置は重複できます。

[SSE1]
演算
PADDB mmx1, mmx2/mem64 | 0F FC /r
第1オペランドの8つの 8bit 整数値を、第2オペランドの対応する 8bit 整数値に加算し、各バイトの結果を、第1オペランドの対応するバイトに書き込みます。

PADDB 命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 8bit のみが宛先に書き込まれます。
PADDSB mmx1, mmx2/mem64 | 0F EC /r
PADDB と同じですが、加算の結果は、符号付き 8bit 整数として飽和されます。
PADDUSB mmx1, mmx2/mem64 | 0F DC /r
PADDB と同じですが、加算の結果は、符号なし 8bit 整数として飽和されます。
PADDW mmx1, mmx2/mem64 | 0F FD /r
第1オペランドの4つの 16bit 整数値を、第2オペランドの対応する 16bit 整数値に加算し、各 WORD の結果を、第1オペランドの対応する WORD に書き込みます。

結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
PADDSW mmx1, mmx2/mem64 | 0F ED /r
PADDW と同じですが、加算の結果は、符号付き 16bit 整数として飽和されます。
PADDUSW mmx1, mmx2/mem64 | 0F DD /r
PADDW と同じですが、加算の結果は、符号なし 16bit 整数として飽和されます。
PADDD mmx1, mmx2/mem64 | 0F FE /r
第1オペランドの2つの 32bit 整数値を、第2オペランドの対応する 32bit 整数値に加算し、それぞれの結果を、第1オペランドの対応する DWORD に書き込みます。

結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。
PADDQ mmx1, mmx2/mem64 | 0F D4 /r
第1オペランドの1つの 64bit 整数値を、第2オペランドの 64bit 整数値に加算し、結果を、第1オペランドに書き込みます。

結果がオーバーフローした場合、キャリーは無視され、結果の下位 64bit のみが宛先に書き込まれます。

[SSE2 命令]
PSUBB mmx1, mmx2/mem64 | 0F F8 /r
第1オペランドの8つの 8bit 整数から、第2オペランドの対応する 8bit 整数を減算し、結果を、対応する第1オペランドのバイトに書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 8bit のみが宛先に書き込まれます。
PSUBUSB mmx1, mmx2/mem64 | 0F D8 /r
第1オペランドの8つの符号なし 8bit 整数から、第2オペランドの対応する符号なし 8bit 整数を減算し、結果を、対応する第1オペランドのバイトに書き込みます。
減算の結果は、符号なし 8bit 数値に飽和されます。
PSUBSB mmx1, mmx2/mem64 | 0F E8 /r
第1オペランドの8つの符号付き 8bit 整数から、第2オペランドの対応する符号付き 8bit 整数を減算し、結果を、対応する第1オペランドのバイトに書き込みます。
減算の結果は、符号付き 8bit 数値に飽和されます。
PSUBW mmx1, mmx2/mem64 | 0F F9 /r
第1オペランドの4つの 16bit 整数から、第2オペランドの対応する 16bit 整数を減算し、結果を、対応する第1オペランドの WORD に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
PSUBUSW mmx1, mmx2/mem64 | 0F D9 /r
第1オペランドの4つの符号なし 16bit 整数から、第2オペランドの対応する符号なし 16bit 整数を減算し、結果を、対応する第1オペランドの WORD に書き込みます。
減算の結果は、符号なし 16bit 数値に飽和されます。
PSUBSW mmx1, mmx2/mem64 | 0F E9 /r
第1オペランドの4つの符号付き 16bit 整数から、第2オペランドの対応する符号付き 16bit 整数を減算し、結果を、対応する第1オペランドの WORD に書き込みます。
減算の結果は、符号付き 16bit 数値に飽和されます。
PSUBD mmx1, mmx2/mem64 | 0F FA /r
第1オペランドの2つの 32bit 整数から、第2オペランドの対応する 32bit 整数を減算し、結果を、対応する第1オペランドの DWORD に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。
PSUBQ mmx1, mmx2/mem64 | 0F FB /r
第1オペランドの1つの 64bit 整数から、第2オペランドの対応する 64bit 整数を減算し、結果を第1オペランドに書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 64bit のみが宛先に書き込まれます。

[SSE2]
PMULLW mmx1, mmx2/mem64 | 0F E5 /r
2つのオペランドの4つの符号付き 16bit 値を、それぞれ op1 * op2 で乗算し、結果の 32bit の下位 16bit を、第1オペランドの対応するワードに書き込みます。
PMULHW mmx1, mmx2/mem64 | 0F E4 /r
2つのオペランドの4つの符号付き 16bit 値を、それぞれ op1 * op2 で乗算し、結果の 32bit の上位 16bit を、第1オペランドの対応するワードに書き込みます。

op1 |4321|
op2 |8765|
結果 |4*8|3*7|2*6|1*5| (Hi)
PMULHUW mmx1, mmx2/mem64 | 0F 0F /r B7
2つのオペランドの4つの符号なし 16bit 値を、それぞれ op1 * op2 で乗算し、結果の 32bit の上位 16bit を、第1オペランドの対応するワードに書き込みます。

[SSE1]
PMADDWD mmx1, mmx2/mem64 | 0F F5 /r
2つのオペランドの4つの符号付き 16bit 値を、それぞれ op1 * op2 で乗算し、隣り合う2つの結果 (32bit) を加算します。
その結果の2つの 32bit 値を、第1オペランドに書き込みます。

16bit 値が両方とも 8000h (-32768) の場合、結果は 8000_0000h となり、符号付き 32bit 値として正しい結果となりません。

op1 |4321|
op2 |8765|
1 * 5 + 2 * 6 -> A
3 * 7 + 4 * 8 -> B
結果 | B | A |
PMULUDQ mmx1, mmx2/mem64 | 0F F4 /r
2つのオペランドの下位 32bit、符号なし整数値を乗算し、64bit の結果を、第1オペランドに書き込みます。

op1 |-|A|
op2 |-|B| -> op1 |A*B|

[SSE2]
PAVGB mmx1, mmx2/mem64 | 0F E0 /r
第1オペランドの8つの符号なし 8bit 整数値と、それに対応する、第2オペランドの8つの符号なし 8bit 整数値の、丸められた平均を計算し、結果を、対応する第1オペランドのバイトに書き込みます。

平均は、オペランドの各ペアを加算した一時的な 9bit 値に 1 を加えてから、それを 1bit 右シフトすることによって計算されます。

[SSE2]
PAVGW mmx1, mmx2/mem64 | 0F E3 /r
第1オペランドの4つの符号なし 16bit 整数値と、それに対応する、第2オペランドの4つの符号なし 16bit 整数値の、丸められた平均を計算し、結果を、対応する第1オペランドの WORD に書き込みます。

平均は、オペランドの各ペアを加算した一時的な 17bit 値に 1 を加えてから、それを 1bit 右シフトすることによって計算されます。

[SSE2]
PSADBW mmx1, mmx2/mem64 | 0F F6 /r
2つのオペランドの、対応する8つの符号なし 8bit 値の差の絶対値を計算し、その8つの値の合計を、符号なし 16bit 整数として第1オペランドに書き込みます。
宛先の残りのバイトはすべて 0 にクリアされます。

[SSE2]
論理演算
PAND mmx1, mmx2/mem64 | 0F DB /r
2つのオペランドのビット単位の論理 AND を実行し、結果を第1オペランドに書き込みます。
PANDN mmx1, mmx2/mem64 | 0F DF /r
第2オペランドのビットを反転した後、第1オペランドと AND し、結果を第1オペランドに書き込みます。
POR mmx1, mmx2/mem64 | 0F EB /r
2つのオペランドのビット単位の論理 OR を実行し、結果を第1オペランドに書き込みます。
PXOR mmx1, mmx2/mem64 | 0F EF /r
2つのオペランドのビット単位の XOR を実行し、結果を第1オペランドに書き込みます。
ビット操作
PSLLW mmx1, mmx2/mem64 | 0F F1 /r
PSLLW mmx, imm8        | 0F 71 /6 ib
第1オペランドの4つの 16bit 値を、第2オペランドで指定されたビット数だけ左シフトし、結果を第1オペランドの対応する WORD に書き込みます。

シフトによって空になる下位ビットは 0 にクリアされます。
シフト数が 15 より大きい場合、結果は 0 になります。
PSLLD mmx1, mmx2/mem64 | 0F F2 /r
PSLLD mmx, imm8        | 0F 72 /6 ib
第1オペランドの2つの 32bit 値を、第2オペランドで指定されたビット数だけ左シフトし、結果を第1オペランドの対応する DWORD に書き込みます。

シフトによって空になる下位ビットは 0 にクリアされます。
シフト数が 31 より大きい場合、結果は 0 になります。
PSLLQ mmx1, mmx2/mem64 | 0F F3 /r
PSLLQ mmx, imm8        | 0F 73 /6 ib
第1オペランドの値を、第2オペランドで指定されたビット数だけ左シフトし、結果を第1オペランドに書き込みます。

シフトによって空になる下位ビットは 0 にクリアされます。
シフト数が 63 より大きい場合、結果は 0 になります。
PSRAW mmx1, mmx2/mem64 | 0F E1 /r
PSRAW mmx, imm8        | 0F 71 /4 ib
第1オペランドの4つの 16bit 値を、第2オペランドで指定されたビット数だけ右シフトし、結果を第1オペランドの対応する WORD に書き込みます。

シフトによって空になる上位ビットは、最上位の符号ビットがコピーされます。
シフト数が 15 より大きい場合、結果は符号ビットで埋められます。
PSRAD mmx1, mmx2/mem64 | 0F E2 /r
PSRAD mmx, imm8        | 0F 72 /4 ib
第1オペランドの2つの 32bit 値を、第2オペランドで指定されたビット数だけ右シフトし、結果を第1オペランドの対応する DWORD に書き込みます。

シフトによって空になる上位ビットは、最上位の符号ビットがコピーされます。
シフト数が 31 より大きい場合、結果は符号ビットで埋められます。
PSRLW mmx1, mmx2/mem64 | 0F D1 /r
PSRLW mmx, imm8        | 0F 71 /2 ib
第1オペランドの4つの 16bit 値を、第2オペランドで指定されたビット数だけ右シフトし、結果を第1オペランドの対応する WORD に書き込みます。

シフトによって空になる上位ビットは 0 になります。
シフト数が 15 より大きい場合、結果は 0 になります。
PSRLD mmx1, mmx2/mem64 | 0F D2 /r
PSRLD mmx, imm8        | 0F 72 /2 ib
第1オペランドの2つの 32bit 値を、第2オペランドで指定されたビット数だけ右シフトし、結果を第1オペランドの対応する DWORD に書き込みます。

シフトによって空になる上位ビットは 0 になります。
シフト数が 31 より大きい場合、結果は 0 になります。
PSRLQ mmx1, mmx2/mem64 | 0F D3 /r
PSRLQ mmx, imm8        | 0F 73 /2 ib
第1オペランドの1つの 64bit 値を、第2オペランドで指定されたビット数だけ右シフトし、結果を第1オペランドに書き込みます。

シフトによって空になる上位ビットは 0 になります。
シフト数が 63 より大きい場合、結果は 0 になります。
比較
PCMPEQB mmx1, mmx2/mem64 | 0F 74 /r
2つのオペランドの、対応する8つのバイトを比較し、結果を、対応する第1オペランドのバイトに書き込みます。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
PCMPEQW mmx1, mmx2/mem64 | 0F 75 /r
2つのオペランドの、対応する4つの WORD を比較し、結果を、対応する第1オペランドの WORD に書き込みます。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
PCMPEQD mmx1, mmx2/mem64 | 0F 76 /r
2つのオペランドの、対応する2つの DWORD を比較し、結果を、対応する第1オペランドの DWORD に書き込みます。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
PCMPGTB mmx1, mmx2/mem64 | 0F 64 /r
2つのオペランドの、対応する8つの符号付き 8bit 値を比較し、結果を、対応する第1オペランドのバイトに書き込みます。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
PCMPGTW mmx1, mmx2/mem64 | 0F 65 /r
2つのオペランドの、対応する4つの符号付き 16bit 値を比較し、結果を、対応する第1オペランドのバイトに書き込みます。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
PCMPGTD mmx1, mmx2/mem64 | 0F 66 /r
2つのオペランドの、対応する2つの符号付き 32bit 値を比較し、結果を、対応する第1オペランドのバイトに書き込みます。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
最大値/最小値
PMINUB mmx1, mmx2/mem64 | 0F DA /r
2つのオペランドの、対応する8つの符号なし 8bit 値を比較して、小さい方の値を、対応する第1オペランドのバイトに書き込みます。

[SSE1]
PMINSW mmx1, mmx2/mem64 | 0F EA /r
2つのオペランドの、対応する4つの符号付き 16bit 値を比較して、小さい方の値を、対応する第1オペランドの WORD に書き込みます。

[SSE1]
PMAXUB mmx1, mmx2/mem64 | 0F DE /r
2つのオペランドの、対応する8つの符号なし 8bit 値を比較して、大きい方の値を、対応する第1オペランドのバイトに書き込みます。

[SSE1]
PMAXSW mmx1, mmx2/mem64 | 0F EE /r
2つのオペランドの、対応する4つの符号付き 16bit 値を比較して、大きい方の値を、対応する第1オペランドの WORD に書き込みます。

[SSE1]
パック
PACKUSWB mmx1, mmx2/mem64 | 0F 67 /r
2つのオペランド内の、4つの 16bit 符号付き整数を、8つの 8bit 符号なし整数に変換して、第1オペランドに格納します。
最大で FFh (255)、最小で 00h (0) に飽和します。

op1 |4|3|2|1|
op2 |8|7|6|5| → op1 |87654321|
PACKSSWB mmx1, mmx2/mem64 | 0F 63 /r
2つのオペランド内の、4つの 16bit 符号付き整数を、8つの 8bit 符号付き整数に変換して、第1オペランドに格納します。
最大で 7Fh (127)、最小で 80h (-128) に飽和します。

op1 |4|3|2|1|
op2 |8|7|6|5| → op1 |87654321|
PACKSSDW mmx1, mmx2/mem64 | 0F 6B /r
2つのオペランド内の、2つの 32bit 符号付き整数を、4つの 16bit 符号付き整数に変換して、第1オペランドに格納します。
最大で 7FFFh (32767)、最小で 8000h (-32768) に飽和します。

op1 |2|1|
op2 |4|3| → op1 |4321|
アンパック
PUNPCKLBW mmx1, mmx2/mem32 | 0F 60 /r
2つのオペランドの下位 32bit から、4つのバイトを取り出し、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、16bit にゼロ拡張される形になります。

op1 |----|4321|
op2 |----|8765| -> op1 |84736251|
PUNPCKHBW mmx1, mmx2/mem64 | 0F 68 /r
2つのオペランドの上位 32bit から、4つのバイトを取り出し、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、16bit にゼロ拡張される形になります。

op1 |4321|----|
op2 |8765|----| -> op1 |84736251|
PUNPCKLWD mmx1, mmx2/mem32 | 0F 61 /r
2つのオペランドの下位 32bit から、2つの WORD を取り出し、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、32bit にゼロ拡張される形になります。

op1 |--|21|
op2 |--|43| -> op1 |4231|
PUNPCKHWD mmx1, mmx2/mem64 | 0F 69 /r
2つのオペランドの上位 32bit から、2つの WORD を取り出し、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、32bit にゼロ拡張される形になります。

op1 |21|--|
op2 |43|--| -> op1 |4231|
PUNPCKLDQ mmx1, mmx2/mem32 | 0F 62 /r
2つのオペランドの下位 32bit を、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、64bit にゼロ拡張される形になります。

op1 |-|A|
op2 |-|B| -> op1 |BA|
PUNPCKHDQ mmx1, mmx2/mem64 | 0F 6A /r
2つのオペランドの上位 32bit を、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、64bit にゼロ拡張される形になります。

op1 |A|-|
op2 |B|-| -> op1 |BA|
パック抽出/挿入
PEXTRW reg32, mmx, imm8 | 0F C5 /r ib
MMX レジスタから、即値バイトオペランドで指定された位置の 16bit 値を抽出し、それを 32bit にゼロ拡張して、32bit 汎用レジスタの下位ワードに書き込みます。

即値バイトは、0〜3 の値で、抽出する 16bit 値のインデックスを指定します。0 は最下位です。

[SSE1]
PINSRW mmx, reg32/mem16, imm8 | 0F C4 /r ib
32bit 汎用レジスタ、または 16bit メモリ位置の下位ワードから、16 ビット値を MMX レジスタに挿入します。
挿入する位置は、即値オペランドの 0〜3 の値で指定します (0 が最下位)。

宛先レジスタの他の部分は変更されません。

[SSE1]
状態
EMMS | 0F 77
x87 タグワード・レジスタのビットをすべて 1 に設定することで、x86 レジスタをすべて空の状態にして、MMX 状態をクリアします。
後続の x87 命令が正しく実行できる状態になります。
FXSAVE mem512env | 0F AE /0
XMM、MMX、x87 の状態を、メモリ内の 16 byte に整列された領域に保存します。

16 byte に整列されていない場合、アラインメントチェックが有効な場合は CPL=3 の #AC 例外によって、そうでない場合は、#GP(0) 例外によって、実行が禁止される可能性があります。

FSAVE や FNSAVE 命令とは異なり、FXSAVE は x87 タグワードレジスタを変更しません。
MMX/x87 データレジスタの内容は保持され、レジスタが有効である可能性があることを示します。
FXSAVE 後に、MMX/x87 データレジスタの内容を無効にするには、FINIT 命令を実行する必要があります。

FXSAVE は、保留中のマスクされていない x87 浮動小数点例外をチェックしません。FWAIT 命令を、この目的に使用できます。

FXSAVE 用に、2 つの 512bit メモリフォーマット、XMM0〜XMM15 を保存する 64bit フォーマット、XMM0〜XMM7 のみを保存する 32bit レガシーフォーマットをサポートします。
64bit モードで実行される場合は 64bit フォーマットが使用され、それ以外の場合は、32bit フォーマットが使用されます。
64bit フォーマットが使用される場合、オペランドサイズが 64bit の場合は、FXSAVE は x87 命令ポインタレジスタを offset64 として保存し、それ以外の場合は sel:offset32 として保存します。

fast-FXSAVE/FXRSTOR (FFXSR) 機能が EFER で有効になっている場合、FXSAVE は、CPL 0 の 64bit モードで実行されるときに、XMM レジスタ (XMM0〜XMM15) を保存しません。
fast-FXSAVE/FXRSTOR が有効かどうかに関係なく、MXCSR は保存されます。

CR4 のオペレーティングシステムの FXSAVE/FXRSTOR サポートビット (OSFXSR) が 0 にクリアされると、FXSAVE は、XMM0〜XMM15 または MXCSR のイメージを保存しません。

この命令のサポートは実装によって異なります (x64 には含まれています)。
CPUID(FXSR): 8000_0001h > EDX(bit24)
FXRSTOR mem512env | 0F AE /1
FXSAVE 命令によって保存された、メモリ内 (16byte 境界) の情報から、XMM、MMX、x87 の状態を復元します。

FXRSTOR の結果、ロードされた x87 ステータスワード・レジスタに例外フラグが設定され、これらの例外が x87 コントロールワード・レジスタでマスク解除される場合、次の浮動小数点命令が実行されるときに、浮動小数点例外が発生します。

復元された MXCSR レジスタに、例外ステータスフラグにセットされたビットが含まれており、対応する例外マスクビットがクリアされている (マスクされていない例外を示す) 場合、MXCSR レジスタをロードしても、SIMD 浮動小数点例外 (#XF) は発生しません。

FXRSTOR は、FCW のエラーマスクビットと FSW のエラーステータスビットから再計算した後に FSW.ES=1 を設定する場合を除き、x87 エラーポインタ (最後の命令ポインタ、最後のデータポインタ、最後のオペコード) を復元しません。

高速 FXSAVE/FXRSTOR (FFXSR) 機能が EFER で有効になっている場合、FXRSTOR は、CPL 0 の 64bit モードで実行されたときに、XMM レジスタ (XMM0〜XMM15) を復元しません。
高速 FXSAVE/FXRSTOR が有効かどうかにかかわらず、MXCSR は復元されます。

CR4 のオペレーティングシステムの FXSAVE/FXRSTOR サポートビット (OSFXSR) が 0 にクリアされると、XMM0〜XMM15 および MXCSR の保存されたイメージは、プロセッサにロードされません。
FXRSTOR 命令が、予約済みの MXCSR ビットに、ゼロ以外の値をロードしようとすると、一般保護例外が発生します。
ソフトウェアは MXCSR_MASK を使用して、MXCSR のどのビットが予約されているかを決定できます。

この命令のサポートは実装によって異なります (x64 には含まれています)。
CPUID(FXSR): 8000_0001h > EDX(bit24)