命令セット

提供: IS2005 Wiki (CPU実験)
移動: 案内検索

フォーマット

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があればいらないかなと思ったので削除。

あと整数の乗算と除算は実装するかどうか判らないが一応入れておいた。

とりあえずこれでシミュレータ作ってみます。