移動 | |
MOVD MOVQ | 32/64bit 値の移動 |
---|---|
MOVDQ2Q | XMM → MMX レジスタの移動 |
MOVQ2DQ | MMX → XMM レジスタに移動 |
MOVNTQ | 非テンポラルなメモリ移動 |
MASKMOVQ | マスクありの移動 |
PMOVMSKB | パック BYTE の最上位ビットを移動 |
PSHUFW | パック WORD を指定位置に移動 |
演算 | |
PADDB | パック BYTE 加算 |
PADDSB | パック BYTE 加算 (符号付き・飽和) |
PADDUSB | パック BYTE 加算 (符号なし・飽和) |
PADDW | パック WORD 加算 |
PADDSW | パック WORD 加算 (符号付き・飽和) |
PADDUSW | パック WORD 加算 (符号なし・飽和) |
PADDD | パック DWORD 加算 |
PADDQ | QWORD 加算 |
PSUBB | パック BYTE 減算 |
PSUBUSB | パック BYTE 減算 (符号なし・飽和) |
PSUBSB | パック BYTE 減算 (符号付き・飽和) |
PSUBW | パック WORD 減算 |
PSUBUSW | パック WORD 減算 (符号なし・飽和) |
PSUBSW | パック WORD 減算 (符号付き・飽和) |
PSUBD | パック DWORD 減算 |
PSUBQ | QWORD 減算 |
PMULLW | パック WORD 乗算 (符号付き・下位16bit) |
PMULHW | パック WORD 乗算 (符号付き・上位16bit) |
PMULHUW | パック WORD 乗算 (符号なし・上位16bit) |
PMADDWD | パック WORD の乗算と DWORD の加算 |
PMULUDQ | 符号なし DWORD 乗算 |
PAVGB | パック BYTE (符号なし) 平均値 |
PAVGW | パック WORD (符号なし) 平均値 |
PSADBW | バイトの絶対差分の合計をワードにパック |
論理演算 | |
PAND | AND |
PANDN | NOT AND |
POR | OR |
PXOR | XOR |
ビット操作 | |
PSLLW | パック WORD を左シフト |
PSLLD | パック DWORD を左シフト |
PSLLQ | QWORD を左シフト |
PSRAW | パック WORD 右シフト (符号付き) |
PSRAD | パック DWORD 右シフト (符号付き) |
PSRLW | パック WORD 右シフト (符号なし) |
PSRLD | パック DWORD 右シフト (符号なし) |
PSRLQ | QWORD 右シフト (符号なし) |
比較 | |
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 に挿入 |
状態 | |
EMMS | MMX 状態をクリアする |
FXSAVE | XMM,MMX,x87 状態の保存 |
FXRSTOR | XMM,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 レジスタにコピーする場合、ゼロ拡張されます。
MMX レジスタと、MMX レジスタ/メモリ間の移動 (64bit)。
32bit 値を MMX レジスタにコピーする場合、ゼロ拡張されます。
MOVNTQ mem64, mmx | 0F E7 /r
MMX レジスタ値を、64bit メモリ位置に保存します。
この命令は、データが非一時的であり、すぐに再び使用される可能性が低いことを、プロセッサに示します。
プロセッサは、ストアを書き込み結合 (WC) メモリ書き込みとして処理するため、キャッシュ汚染が最小限に抑えられます。
[SSE1]
この命令は、データが非一時的であり、すぐに再び使用される可能性が低いことを、プロセッサに示します。
プロセッサは、ストアを書き込み結合 (WC) メモリ書き込みとして処理するため、キャッシュ汚染が最小限に抑えられます。
[SSE1]
MASKMOVQ mmx1, mmx2 | 0F F7 /r
第2オペランドで選択された、第1オペランドのバイトを、DS:rDI レジスタで指定されたメモリに格納します (64bit モードでは DS は無視されます)。
第1オペランドは MMX レジスタで、第2オペランドは別の MMX レジスタです。
第2オペランドの各バイトの最上位ビットは、第1オペランドの対応するバイトのストア (1 = ストア、0 = ストアなし) を指定します。
選択されていない要素の、例外とトラップの動作は、実装に依存します。
たとえば、特定の実装では、実際には書き込まれていないバイトに対して、データブレークポイントまたはページフォールトを通知する場合があります。
[SSE1]
第1オペランドは MMX レジスタで、第2オペランドは別の MMX レジスタです。
第2オペランドの各バイトの最上位ビットは、第1オペランドの対応するバイトのストア (1 = ストア、0 = ストアなし) を指定します。
選択されていない要素の、例外とトラップの動作は、実装に依存します。
たとえば、特定の実装では、実際には書き込まれていないバイトに対して、データブレークポイントまたはページフォールトを通知する場合があります。
[SSE1]
PMOVMSKB reg32, mmx | 0F D7 /r
第2オペランドの8つのバイトの最上位ビットから、8bit 値を形成し、第1オペランドの下位 8bit に移動します。
宛先オペランドの上位 24bit は 0 にクリアされます。
[SSE2]
宛先オペランドの上位 24bit は 0 にクリアされます。
[SSE2]
PSHUFW mmx1, mmx2/mem64, imm8 | 0F 70 /r ib
第2オペランド内の4つの WORD を、それぞれ指定された位置で、第1オペランドに移動します。
即値オペランドの 2bit x 4 の値で、第1オペランドの対応する位置のワードを、ソースのどの位置からコピーするかを指定できます。
ソースの位置は重複できます。
[SSE1]
即値オペランドの 2bit x 4 の値で、第1オペランドの対応する位置のワードを、ソースのどの位置からコピーするかを指定できます。
ソースの位置は重複できます。
[SSE1]
演算
PADDB mmx1, mmx2/mem64 | 0F FC /r
第1オペランドの8つの 8bit 整数値を、第2オペランドの対応する 8bit 整数値に加算し、各バイトの結果を、第1オペランドの対応するバイトに書き込みます。
PADDB 命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 8bit のみが宛先に書き込まれます。
PADDB 命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 8bit のみが宛先に書き込まれます。
PADDW mmx1, mmx2/mem64 | 0F FD /r
第1オペランドの4つの 16bit 整数値を、第2オペランドの対応する 16bit 整数値に加算し、各 WORD の結果を、第1オペランドの対応する WORD に書き込みます。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
PADDD mmx1, mmx2/mem64 | 0F FE /r
第1オペランドの2つの 32bit 整数値を、第2オペランドの対応する 32bit 整数値に加算し、それぞれの結果を、第1オペランドの対応する DWORD に書き込みます。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。
PADDQ mmx1, mmx2/mem64 | 0F D4 /r
第1オペランドの1つの 64bit 整数値を、第2オペランドの 64bit 整数値に加算し、結果を、第1オペランドに書き込みます。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 64bit のみが宛先に書き込まれます。
[SSE2 命令]
結果がオーバーフローした場合、キャリーは無視され、結果の下位 64bit のみが宛先に書き込まれます。
[SSE2 命令]
PSUBB mmx1, mmx2/mem64 | 0F F8 /r
第1オペランドの8つの 8bit 整数から、第2オペランドの対応する 8bit 整数を減算し、結果を、対応する第1オペランドのバイトに書き込みます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 8bit のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 8bit のみが宛先に書き込まれます。
PSUBUSB mmx1, mmx2/mem64 | 0F D8 /r
第1オペランドの8つの符号なし 8bit 整数から、第2オペランドの対応する符号なし 8bit 整数を減算し、結果を、対応する第1オペランドのバイトに書き込みます。
減算の結果は、符号なし 8bit 数値に飽和されます。
減算の結果は、符号なし 8bit 数値に飽和されます。
PSUBSB mmx1, mmx2/mem64 | 0F E8 /r
第1オペランドの8つの符号付き 8bit 整数から、第2オペランドの対応する符号付き 8bit 整数を減算し、結果を、対応する第1オペランドのバイトに書き込みます。
減算の結果は、符号付き 8bit 数値に飽和されます。
減算の結果は、符号付き 8bit 数値に飽和されます。
PSUBW mmx1, mmx2/mem64 | 0F F9 /r
第1オペランドの4つの 16bit 整数から、第2オペランドの対応する 16bit 整数を減算し、結果を、対応する第1オペランドの WORD に書き込みます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
PSUBUSW mmx1, mmx2/mem64 | 0F D9 /r
第1オペランドの4つの符号なし 16bit 整数から、第2オペランドの対応する符号なし 16bit 整数を減算し、結果を、対応する第1オペランドの WORD に書き込みます。
減算の結果は、符号なし 16bit 数値に飽和されます。
減算の結果は、符号なし 16bit 数値に飽和されます。
PSUBSW mmx1, mmx2/mem64 | 0F E9 /r
第1オペランドの4つの符号付き 16bit 整数から、第2オペランドの対応する符号付き 16bit 整数を減算し、結果を、対応する第1オペランドの WORD に書き込みます。
減算の結果は、符号付き 16bit 数値に飽和されます。
減算の結果は、符号付き 16bit 数値に飽和されます。
PSUBD mmx1, mmx2/mem64 | 0F FA /r
第1オペランドの2つの 32bit 整数から、第2オペランドの対応する 32bit 整数を減算し、結果を、対応する第1オペランドの DWORD に書き込みます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。
PSUBQ mmx1, mmx2/mem64 | 0F FB /r
第1オペランドの1つの 64bit 整数から、第2オペランドの対応する 64bit 整数を減算し、結果を第1オペランドに書き込みます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 64bit のみが宛先に書き込まれます。
[SSE2]
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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]
[SSE1]
PMADDWD mmx1, mmx2/mem64 | 0F F5 /r
2つのオペランドの4つの符号付き 16bit 値を、それぞれ op1 * op2 で乗算し、隣り合う2つの結果 (32bit) を加算します。
その結果の2つの 32bit 値を、第1オペランドに書き込みます。
16bit 値が両方とも 8000h (-32768) の場合、結果は 8000_0000h となり、符号付き 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オペランドに書き込みます。
[SSE2]
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]
平均は、オペランドの各ペアを加算した一時的な 9bit 値に 1 を加えてから、それを 1bit 右シフトすることによって計算されます。
[SSE2]
PAVGW mmx1, mmx2/mem64 | 0F E3 /r
第1オペランドの4つの符号なし 16bit 整数値と、それに対応する、第2オペランドの4つの符号なし 16bit 整数値の、丸められた平均を計算し、結果を、対応する第1オペランドの WORD に書き込みます。
平均は、オペランドの各ペアを加算した一時的な 17bit 値に 1 を加えてから、それを 1bit 右シフトすることによって計算されます。
[SSE2]
平均は、オペランドの各ペアを加算した一時的な 17bit 値に 1 を加えてから、それを 1bit 右シフトすることによって計算されます。
[SSE2]
PSADBW mmx1, mmx2/mem64 | 0F F6 /r
2つのオペランドの、対応する8つの符号なし 8bit 値の差の絶対値を計算し、その8つの値の合計を、符号なし 16bit 整数として第1オペランドに書き込みます。
宛先の残りのバイトはすべて 0 にクリアされます。
[SSE2]
宛先の残りのバイトはすべて 0 にクリアされます。
[SSE2]
論理演算
ビット操作
PSLLW mmx1, mmx2/mem64 | 0F F1 /r PSLLW mmx, imm8 | 0F 71 /6 ib
第1オペランドの4つの 16bit 値を、第2オペランドで指定されたビット数だけ左シフトし、結果を第1オペランドの対応する WORD に書き込みます。
シフトによって空になる下位ビットは 0 にクリアされます。
シフト数が 15 より大きい場合、結果は 0 になります。
シフトによって空になる下位ビットは 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 になります。
シフトによって空になる下位ビットは 0 にクリアされます。
シフト数が 31 より大きい場合、結果は 0 になります。
PSLLQ mmx1, mmx2/mem64 | 0F F3 /r PSLLQ mmx, imm8 | 0F 73 /6 ib
第1オペランドの値を、第2オペランドで指定されたビット数だけ左シフトし、結果を第1オペランドに書き込みます。
シフトによって空になる下位ビットは 0 にクリアされます。
シフト数が 63 より大きい場合、結果は 0 になります。
シフトによって空になる下位ビットは 0 にクリアされます。
シフト数が 63 より大きい場合、結果は 0 になります。
PSRAW mmx1, mmx2/mem64 | 0F E1 /r PSRAW mmx, imm8 | 0F 71 /4 ib
第1オペランドの4つの 16bit 値を、第2オペランドで指定されたビット数だけ右シフトし、結果を第1オペランドの対応する WORD に書き込みます。
シフトによって空になる上位ビットは、最上位の符号ビットがコピーされます。
シフト数が 15 より大きい場合、結果は符号ビットで埋められます。
シフトによって空になる上位ビットは、最上位の符号ビットがコピーされます。
シフト数が 15 より大きい場合、結果は符号ビットで埋められます。
PSRAD mmx1, mmx2/mem64 | 0F E2 /r PSRAD mmx, imm8 | 0F 72 /4 ib
第1オペランドの2つの 32bit 値を、第2オペランドで指定されたビット数だけ右シフトし、結果を第1オペランドの対応する DWORD に書き込みます。
シフトによって空になる上位ビットは、最上位の符号ビットがコピーされます。
シフト数が 31 より大きい場合、結果は符号ビットで埋められます。
シフトによって空になる上位ビットは、最上位の符号ビットがコピーされます。
シフト数が 31 より大きい場合、結果は符号ビットで埋められます。
PSRLW mmx1, mmx2/mem64 | 0F D1 /r PSRLW mmx, imm8 | 0F 71 /2 ib
第1オペランドの4つの 16bit 値を、第2オペランドで指定されたビット数だけ右シフトし、結果を第1オペランドの対応する WORD に書き込みます。
シフトによって空になる上位ビットは 0 になります。
シフト数が 15 より大きい場合、結果は 0 になります。
シフトによって空になる上位ビットは 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 になります。
シフトによって空になる上位ビットは 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 になります。
シフトによって空になる上位ビットは 0 になります。
シフト数が 63 より大きい場合、結果は 0 になります。
比較
PCMPEQB mmx1, mmx2/mem64 | 0F 74 /r
2つのオペランドの、対応する8つのバイトを比較し、結果を、対応する第1オペランドのバイトに書き込みます。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
PCMPEQW mmx1, mmx2/mem64 | 0F 75 /r
2つのオペランドの、対応する4つの WORD を比較し、結果を、対応する第1オペランドの WORD に書き込みます。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
PCMPEQD mmx1, mmx2/mem64 | 0F 76 /r
2つのオペランドの、対応する2つの DWORD を比較し、結果を、対応する第1オペランドの DWORD に書き込みます。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
値が等しい場合、ビットはすべて 1。値が等しくない場合、ビットはすべて 0 になります。
PCMPGTB mmx1, mmx2/mem64 | 0F 64 /r
2つのオペランドの、対応する8つの符号付き 8bit 値を比較し、結果を、対応する第1オペランドのバイトに書き込みます。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
PCMPGTW mmx1, mmx2/mem64 | 0F 65 /r
2つのオペランドの、対応する4つの符号付き 16bit 値を比較し、結果を、対応する第1オペランドのバイトに書き込みます。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
PCMPGTD mmx1, mmx2/mem64 | 0F 66 /r
2つのオペランドの、対応する2つの符号付き 32bit 値を比較し、結果を、対応する第1オペランドのバイトに書き込みます。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
各バイトで、mmx1 > mmx2 の場合、ビットはすべて 1。それ以外は、ビットはすべて 0 になります。
最大値/最小値
PMINUB mmx1, mmx2/mem64 | 0F DA /r
2つのオペランドの、対応する8つの符号なし 8bit 値を比較して、小さい方の値を、対応する第1オペランドのバイトに書き込みます。
[SSE1]
[SSE1]
PMINSW mmx1, mmx2/mem64 | 0F EA /r
2つのオペランドの、対応する4つの符号付き 16bit 値を比較して、小さい方の値を、対応する第1オペランドの WORD に書き込みます。
[SSE1]
[SSE1]
PMAXUB mmx1, mmx2/mem64 | 0F DE /r
2つのオペランドの、対応する8つの符号なし 8bit 値を比較して、大きい方の値を、対応する第1オペランドのバイトに書き込みます。
[SSE1]
[SSE1]
PMAXSW mmx1, mmx2/mem64 | 0F EE /r
2つのオペランドの、対応する4つの符号付き 16bit 値を比較して、大きい方の値を、対応する第1オペランドの WORD に書き込みます。
[SSE1]
[SSE1]
パック
PACKUSWB mmx1, mmx2/mem64 | 0F 67 /r
2つのオペランド内の、4つの 16bit 符号付き整数を、8つの 8bit 符号なし整数に変換して、第1オペランドに格納します。
最大で FFh (255)、最小で 00h (0) に飽和します。
最大で 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) に飽和します。
最大で 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) に飽和します。
最大で 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 にゼロ拡張される形になります。
第2オペランドが 0 の場合、16bit にゼロ拡張される形になります。
op1 |----|4321| op2 |----|8765| -> op1 |84736251|
PUNPCKHBW mmx1, mmx2/mem64 | 0F 68 /r
2つのオペランドの上位 32bit から、4つのバイトを取り出し、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、16bit にゼロ拡張される形になります。
第2オペランドが 0 の場合、16bit にゼロ拡張される形になります。
op1 |4321|----| op2 |8765|----| -> op1 |84736251|
PUNPCKLWD mmx1, mmx2/mem32 | 0F 61 /r
2つのオペランドの下位 32bit から、2つの WORD を取り出し、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、32bit にゼロ拡張される形になります。
第2オペランドが 0 の場合、32bit にゼロ拡張される形になります。
op1 |--|21| op2 |--|43| -> op1 |4231|
PUNPCKHWD mmx1, mmx2/mem64 | 0F 69 /r
2つのオペランドの上位 32bit から、2つの WORD を取り出し、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、32bit にゼロ拡張される形になります。
第2オペランドが 0 の場合、32bit にゼロ拡張される形になります。
op1 |21|--| op2 |43|--| -> op1 |4231|
PUNPCKLDQ mmx1, mmx2/mem32 | 0F 62 /r
2つのオペランドの下位 32bit を、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、64bit にゼロ拡張される形になります。
第2オペランドが 0 の場合、64bit にゼロ拡張される形になります。
op1 |-|A| op2 |-|B| -> op1 |BA|
PUNPCKHDQ mmx1, mmx2/mem64 | 0F 6A /r
2つのオペランドの上位 32bit を、第1オペランドに交互に並べます。
第2オペランドが 0 の場合、64bit にゼロ拡張される形になります。
第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]
即値バイトは、0〜3 の値で、抽出する 16bit 値のインデックスを指定します。0 は最下位です。
[SSE1]
PINSRW mmx, reg32/mem16, imm8 | 0F C4 /r ib
32bit 汎用レジスタ、または 16bit メモリ位置の下位ワードから、16 ビット値を MMX レジスタに挿入します。
挿入する位置は、即値オペランドの 0〜3 の値で指定します (0 が最下位)。
宛先レジスタの他の部分は変更されません。
[SSE1]
挿入する位置は、即値オペランドの 0〜3 の値で指定します (0 が最下位)。
宛先レジスタの他の部分は変更されません。
[SSE1]
状態
EMMS | 0F 77
x87 タグワード・レジスタのビットをすべて 1 に設定することで、x86 レジスタをすべて空の状態にして、MMX 状態をクリアします。
後続の x87 命令が正しく実行できる状態になります。
後続の 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)
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)
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)