命令セット(ドラフト)
提供: IS2005 Wiki (CPU実験)
重要な変更点(予定)
以降の内容でほぼ本番命令セットの仕様として決定です(問題があれば速やかに変更します)。当情報を利用してコンパイラを開発していただけるとありがたいです。
- レジスタ本数を64本に増強します。
- 即値分岐命令を追加します。
- 次の命令と依存関係がなければ、浮動小数点命令がパイプライン処理されるようになります。したがって、浮動小数点命令と続く命令に依存関係がないように配置するとパフォーマンスが向上します。
- 遅延LOAD命令を、パイプライン処理に対応させ、即時LOAD命令に改正しますが、制約上、引き続き次の命令と依存関係がないように配置するとパフォーマンスが向上します。
- 3/7: ALU最適化のためfunctを変更しました。
- 3/7: GET/PUT命令について注釈を追加しました。
- 3/7: 擬似ニーモニックを修正しました。
- 3/12: 所要クロックを追加しました。
フォーマット
命令は、次の3種類の形式のいずれかとする。
- 0形 : op(4) | rs(6) | rt(6) | rd(6) | 00 | fnct(8)
- 1形 : op(4) | rs(6) | rt(6) | oft(16)
- 2形 : op(4) | rs(6) | opt(6) | oft(16)
r0はゼロレジスタ、r1はスタックポインタ、r2はヒープポインタ、r31はリンクレジスタとして使用するが、実体はすべて汎用レジスタであり、実際にはどのレジスタをリンクレジスタにすることもできるし、ゼロレジスタにゼロでない数を代入することもできる。
アセンブリ表記(以降S表記)での指定順は、0タイプ二項演算ではop rd rs rt、同じく0タイプ一項演算ではop rd rs、0タイプシフト演算bではop rd rs shft、1タイプ演算および保存復元ではop rt rs oft、1タイプ条件分岐ではop rs rt oft、2タイプ条件分岐ではop rs opt oftの順とする(アセンブリにしたときに直感的に理解しやすい順序にしたつもり)。
リスト
op一覧
op | C表記 | S表記 | 所要 |
0000 | rt = rs + oft; | ADDI | 1 |
0001 | rd = fnct(rs, rt); | - | - |
0010 | rt = *(rs + oft); | LOAD | hit:2,miss:5(pipelined) |
0011 | *(rs + oft) = rt; | STORE | 1 |
0100 | if (rs == opt) pc += oft + 1; | BEI | true:3,false:1 |
0101 | if (rs != opt) pc += oft + 1; | BNEI | true:3,false:1 |
0110 | if (rs < opt) pc += oft + 1; | BLI | true:3,false:1 |
0111 | if (rs >= opt) pc += oft + 1; | BGEI | true:3,false:1 |
1000 | if (rs == rt) pc += oft + 1; | BE | true:3,false:1 |
1001 | if (rs != rt) pc += oft + 1; | BNE | true:3,false:1 |
1010 | if (rs < rt) pc += oft + 1; | BL | true:3,false:1 |
1011 | if (rs >= rt) pc += oft + 1; | BGE | true:3,false:1 |
1100 | if (rs < rt) pc += oft + 1; | FBL | true:3,false:1 |
1101 | if (rs >= rt) pc += oft + 1; | FBGE | true:3,false:1 |
1110 | rt = pc + 1, pc += oft + 1; | JAL | 3 |
1111 | pc = rs + oft; | JR | 3 |
fnct一覧
fnct | C表記 | S表記 | 意味 | 所要 |
00000000 | rd = rs + rt; | ADD | 整数加算 | 1 |
00010000 | rd = rs - rt; | SUB | 整数減算 | 1 |
001[shft] | rd = rs << shft; | SLL | 左算術シフト | 1 |
010[shft] | rd = rs >> shft; | SRR | 右算術シフト | 1 |
01100000 | rd = rs & rt; | AND | 論理積 | 1 |
01100100 | rt; | OR | 論理和 | 1 |
01101000 | rd = rs ^ rt; | XOR | 排他的論理和 | 1 |
01101100 | rd = ~rs ^ rt; | XNOR | 否定排他的論理和 | 1 |
01110000 | rd = getc(); | GET | 入力 | 1 |
01111000 | rd = putc(rs); | PUT | 出力 | 1 |
10000000 | rd = rs + rt; | FADD | 浮動小数点数加算 | 3(pipelined) |
10010000 | rd = rs - rt; | FSUB | 浮動小数点数減算 | 3(pipelined) |
10100000 | rd = rs * rt; | FMUL | 浮動小数点数乗算 | 3(pipelined) |
11000000 | rd = 1 / rs; | FINV | 浮動小数点数逆数 | 4(pipelined) |
11100000 | rd = sqrt(rs); | FSQRT | 浮動小数点数平方根 | 4(pipelined) |
注意: GET/PUT命令は、EOF(-1)を返す場合があります。これは、バッファアンダーラン・オーバーフローを意味します。負値を返した場合は、命令を繰り返してください。つまり、次の例のように使ってください。
repeat: PUT r29 r19 BLI r29 0 repeat
擬似mnemonic一覧
次のニーモニックは、プロセッサは対応しないが、アセンブラが変換する。
- NOT
- FDIV (非推奨)
- SUBI
- BGI
- BLEI
- BG
- BLE
- FBE
- FBNE
- FBG
- FBLE
- JUMP
- NOP
- HLT
スモークテスト
; フィボナッチ数列を求める ; r0 = ゼロレジスタ, r1 = スタックポインタ ; r2 = 引数値 n, r3 = 関数値 fib(n) rd r2 jal fib wr r3 srr r5 r3 8 wr r5 srr r5 r3 16 wr r5 srr r5 r3 24 wr r5 hlt: add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 add r3 r3 r0 be r0 r0 hlt fib: bl r2 3 one addi r2 r2 -1 addi r5 r2 -1 addi r1 r1 -2 store r5 r1 0 store r31 r1 1 jal fib load r2 r1 0 store r3 r1 0 jal fib load r5 r1 0 load r31 r1 1 addi r1 r1 2 add r3 r3 r5 jr r31 one: addi r3 r0 1 jr r31