命令セット
目次
フォーマット
32bit固定長で、レジスタを32本とする(整数と浮動小数点数の共用)。
命令は、次の3種類の形式のいずれかとする。
- R形 : op(6) | rs(5) | rt(5) | rd(5) | shft(5) | fnct(6)
- I形 : op(6) | rs(5) | rt(5) | imm16(16)
- J形 : op(6) | rs(5) | imm21(21)
imm16は16bit符号付整数として、imm21は21bit符号付整数として扱う。
r0はゼロレジスタ、r1はスタックポインタ、r2はヒープポインタ、r31はリンクレジスタとして使用するが、実体はすべて汎用レジスタであり、実際にはどのレジスタをリンクレジスタにすることもできるし、ゼロレジスタにゼロでない数を代入することもできる。
アセンブリ表記(以降S表記)での指定順は、Rタイプ二項演算ではop rd rs rt、同じくRタイプ一項演算ではop rd rs、Rタイプシフト演算ではop rd rs shft、Iタイプ演算および保存復元ではop rt rs imm、条件分岐ではop rs rt immの順とする(アセンブリにしたときに直感的に理解しやすい順序にしたつもり)。
リスト
op一覧
op | C表記 | S表記 | 意味 | 所要 |
XX0000 | rd = fnct(rs, rt, shft); | - | - | - |
XX0001 | rt = rs + imm16; | ADDI | 符号付整数加減算 | 1 |
XX0010 | rt = *(rs + imm16); | LOAD | 復元(遅延あり) | 2 |
XX0011 | *(rs + imm16) = rt; | STORE | 保存 | 2 |
XX1000 | if (rs == rt) pc += imm16; | BE | ^^^符号付整数比較 | 1〜3 |
XX1001 | if (rs != rt) pc += imm16; | BNE | 1〜3 | |
XX1010 | if (rs < rt) pc += imm16; | BL | 1〜3 | |
XX1011 | if (rs <= rt) pc += imm16; | BLE | 1〜3 | |
XX1100 | if (rs < rt) pc += imm16; | FBL | ^浮動小数点数比較 | 1〜3 |
XX1101 | if (rs <= rt) pc += imm16; | FBLE | 1〜3 | |
XX1110 | pc = rs + imm21; | JR | Jump Register | 1〜3 |
XX1111 | rs = pc, pc += imm21; | JAL | Jump and Link | 1〜3 |
fnct一覧
fnct | C表記 | S表記 | 意味 | 所要 |
XX0000 | rd = rs + rt; | ADD | 整数加算 | 1 |
XX0001 | rd = rs - rt; | SUB | 整数減算 | 1 |
XX0010 | rd = rs << shft; | SLL | 左算術シフト | 1 |
XX0011 | rd = rs >> shft; | SRR | 右算術シフト | 1 |
XX0100 | rd = rs & rt; | AND | 論理積 | 1 |
XX0101 | rt; | OR | 論理和 | 1 |
XX0110 | rd = rs ^ rt; | XOR | 排他的論理和 | 1 |
XX0111 | rd = ~rs ^ rt; | XNOR | 否定排他的論理和 | 1 |
XX1000 | rd = rs + rt; | FADD | 浮動小数点数加算 | 2 |
XX1001 | rd = rs - rt; | FSUB | 浮動小数点数減算 | 2 |
XX1010 | rd = rs * rt; | FMUL | 浮動小数点数乗算 | 2 |
XX1100 | rd = 1 / rs; | FINV | 浮動小数点数逆数 | 3 |
XX1101 | rd = sqrt(rs); | FSQRT | 浮動小数点数平方根 | 3 |
XX1110 | rd = getc(); | RD | 入力 | 8〜∞ |
XX1111 | rd = putc(rs); | WR | 出力 | 8〜∞ |
擬似mnemonic一覧
次のニーモニックは、プロセッサは対応しないが、アセンブラが変換する。
- NOT
- FDIV
- SUBI
- BG
- BGE
- FBE
- FBNE
- FBG
- FBGE
- JUMP
- NOP
- HLT
スモークテスト
; フィボナッチ数列を求める ; r0 = ゼロレジスタ, r1 = スタックポインタ ; r2 = 引数値 n, r3 = 関数値 fib(n), r4 = 定数値 3 rd r2 addi r4 r0 3 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 r4 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
12/29
現状をマージ。ライブラリに任せた命令をすべて除外。
11/12 by 高山
今更ですがアセンブリ表記のレジスタ指定の順番をちょっと変えてみました。
11/5
アドレス指定無条件分岐はPC相対アドレス指定とし、targetは符号付とすることにした。
10/31
自分で考えるのが面倒なので、とりあえず去年の優勝チームのプロトタイプ[[1]]の命令セットをパクってみようかと。 不要なものや不足しているものがあると思うので、随時変更していきます。
一応ある程度細かいところまで勝手に決めてみた。 命令は削れそうなものはできるだけ削った。特に整数と浮動小数のレジスタの扱いを区別しないことにしたのでFLOAD, FSTORE, FRD, FWRなどの命令がなくなった。 あとCMOVcondもなくても大丈夫と思い削った。 浮動小数比較はFBcondがあればいらないかなと思ったので削除。
あと整数の乗算と除算は実装するかどうか判らないが一応入れておいた。
とりあえずこれでシミュレータ作ってみます。