命令一覧
ニモニック | OP-CODE |
演算(レジスタ/メモリ ─ レジスタ間) |
ADD | 0000 00dw, mod reg r/m |
OR | 0000 10dw, mod reg r/m |
ADC | 0001 00dw, mod reg r/m |
SBB | 0001 10dw, mod reg r/m |
AND | 0010 00dw, mod reg r/m |
SUB | 0010 10dw, mod reg r/m |
XOR | 0011 00dw, mod reg r/m |
CMP | 0011 10dw, mod reg r/m |
TEST | 1001 010w, mod reg r/m |
演算(アキュムレータ ─ 実値間) |
ADD acc,imm | 0000 010w |
OR acc,imm | 0000 110w |
ADC acc,imm | 0001 010w |
SBB acc,imm | 0001 110w |
AND acc,imm | 0010 010w |
SUB acc,imm | 0010 110w |
XOR acc,imm | 0011 010w |
CMP acc,imm | 0011 110w |
演算(レジスタ/メモリ ─ 実値間) |
ADD r/m,imm | 1000 00dw, mod 000 r/m |
OR r/m,imm | 1000 00dw, mod 001 r/m |
ADC r/m,imm | 1000 00dw, mod 010 r/m |
SBB r/m,imm | 1000 00dw, mod 011 r/m |
AND r/m,imm | 1000 00dw, mod 100 r/m |
SUB r/m,imm | 1000 00dw, mod 101 r/m |
XOR r/m,imm | 1000 00dw, mod 110 r/m |
CMP r/m,imm | 1000 00dw, mod 111 r/m |
inc/dec |
INC reg | 0100 0 reg |
DEC reg | 0100 1 reg |
INC r/m | 1111 111w, mod 001 r/m |
DEC r/m | 1111 111w, mod 000 r/m |
ロード・ストア・転送 |
XCHG | 1000 011w, mod reg r/m |
MOV | 1000 10dw, mod reg r/m |
MOV (sreg) | 1000 11d0, mod sreg r/m |
LEA | 1000 1101, mod reg r/m |
XCHG eAX,reg | 1001 0 reg |
MOV acc,[mem] | 1010 000w |
MOV [mem],acc | 1010 001w |
MOV reg,imm | 1011 w reg |
MOV r/m,imm | 1100 011w, mod 000 r/m |
演算 |
TEST r/m,imm | 1111 011w, mod 000 r/m |
NOT r/m | 1111 011w, mod 010 r/m |
NEG r/m | 1111 011w, mod 011 r/m |
MUL r/m | 1111 011w, mod 100 r/m |
IMIL r/m | 1111 011w, mod 101 r/m |
DIV r/m | 1111 011w, mod 110 r/m |
IDIV r/m | 1111 011w, mod 111 r/m |
IMUL reg,r/m,imm | 0110 10w1, mod reg r/m |
※d=0の時は"r/m,reg"の順、d=1の時は"reg,r/m"の順。
r/m (IA-32モード時)
r/m | mod=00 | mod=01 | mod=10 | mod=11 |
000 | [EAX] | [EAX + imm8] | [EAX + imm32] | reg |
001 | [ECX] | [ECX + imm8] | [ECX + imm32] | reg |
010 | [EDX] | [EDX + imm8] | [EDX + imm32] | reg |
011 | [EBX] | [EBX + imm8] | [EBX + imm32] | reg |
100 | SIB | reg |
101 | [EIP + disp32] | [EBP + imm8] | [EBP + imm32] | reg |
110 | [ESI] | [ESI + imm8] | [ESI + imm32] | reg |
111 | [EDI] | [EDI + imm8] | [EDI + imm32] | reg |
※SIB時は、op-codeにSIBを追加し、 [base + index * scale + imm32] のアドレッシングモードを意味する。
パイプラインのステージ
ステージ | 処理内容 |
P | 32Byteのバッファが4組あり、分岐命令が来るまで順次フェッチする。
コアは、常に4つのうち、1つのバッファからフェッチを要求し、分岐命令があったら
分岐すると予測した場合 :他のバッファに順次プリフェッチしていく。
分岐しないと予測した場合 :同じバッファでプリフェッチを続ける。 |
(F) | MMX Pentiumのみ。 |
D1 | デコード1 |
D2 ×2(UV) | デコード2 実効アドレスの計算はここでする。 |
E ×2(UV) | 実効 |
Wb ×2(UV) | 書き込み。 それぞれに、64bitの書き込み用バッファがある。 |
※基本的に、命令は1ステージ1clockずつ、順次進む。
パイプラインのステージ
ステージ | 処理内容 |
BTB0 | |
BTB1 | |
IFU0 | 1次キャッシュから命令をフェッチする。 |
IFU1 | 16Byte単位でフェッチする。 |
IFU2 | プリでコード。16Byte単位で取り出す。 |
ID0 | デコードする。 |
ID1 | 最高3命令 (4μOPs + 1μOP + 1μOP)をデコードする。
但し、命令が複雑、若しくは命令長が7Byte以上の場合は、1clock中にデコードできる命令数が減る。
5μOP以上の命令は、デコードに数クロック要する。
デコーダー1 : 4μOPの15Byte以内の命令をデコードできる。但し9Byte以上の場合は数クロック要。
デコーダー2,3 : 1μOPの 8Byte以内の命令をデコードできる。
つまり、4-1-1μOPとなるように機械語をスケジューリングすると、デコードの効率は良くなる。 |
RAT | 分岐のデコード |
ROB Rb | |
RS | 予約ステーション。リソース(実行ユニット)が利用可能になるまでμOPを保存(バッファ)する。
デコードされたμOPが順次バッファに保存され、リソース(実行ユニット)が使用可能になったら、
そのリソース(実行ユニット)で実行できるμOPを発行する。
μOPの実行順序は、動作に影響を与えない範囲で、CPUが勝手に変更する。
(平均で3clock間、予約ステーションに残るらしい。)
実行ユニット1 : 整数・浮動小数点演算, MMX演算・乗算
実行ユニット2 : 整数演算, MMX演算・シフト
実行ユニット3 : ロード
実行ユニット4 : ストア・アドレス
実行ユニット5 : ストア・データ
最適化を考えるのであれば、これら5つのユニットをフルに活用できるように命令をスケジューリングする。 |
ROB Wb | アーキテクチャ上の状態を順番に更新する。
μOPの実行順序は変わるが、このステージにて機械語にてコーディングされた順番で更新する。 |
RRF | レジスタ・リタイア |
※基本的に、命令は1ステージ1clockずつ順次進む。
命令 | 命令例 | Para | μOP数 |
レジスタへのロード・コピー | MOV LEA | reg, reg/mem/imm | 1μOP |
メモリへのストア | MOV | mem, reg/mem/imm | 2μOP |
演算(メモリアクセス無し) | ADD, OR, ... | reg, reg/imm | 1μOP |
演算(メモリからのロード有り) | ADD, OR, ... | reg, mem | 2μOP |
演算(メモリからのストア有り) | ADD, OR, ... | mem, reg/imm | 4μOP |
乗算・除算(演算結果が32,64bit) | MUL IMUL DIV IDIV | reg/mem | 3〜4μOP |
乗算(AX ← AL × reg8) | MUL | reg8 | 1μOP |
乗算(レジスタ・実数のみ) | IMUL | reg, reg (,imm) | 1μOP |
乗算(メモリからのロード有り) | IMUL | reg, mem (, imm) | 2μOP |
PUSH, POP | PUSH, POP | reg/mem | 2〜3μOP |
分岐(条件分岐 含む) | JMP, JZ, ... | reg/imm/rel | 1μOP |
分岐(メモリからのロード有り) | JMP, JZ, ... | mem | 2μOP |
コール(アドレス実値の場合) | CALL | rel | 4μOP |
リターン(スタックフレーム破棄無し) | RET | | 4μOP |
※子プロセッサー(浮動小数点)関係の命令は、表中には書かなかった。(まず、自分が使わないから。)
※上以外のほとんどの命令は、5μOPを超える。つまり、コーディング時はできる限り、これらの命令を使うようにする。