命令一覧
| ニモニック | 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を超える。つまり、コーディング時はできる限り、これらの命令を使うようにする。