命令セット(ドラフト)

提供: IS2005 Wiki (CPU実験)
2015年11月29日 (日) 15:11時点におけるMaintenance script (トーク)による版 (ページの作成:「== 重要な変更点(予定) == 以降の内容でほぼ本番命令セットの仕様として決定です(問題があれば速やかに変更します)。当情報...」)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

重要な変更点(予定)

以降の内容でほぼ本番命令セットの仕様として決定です(問題があれば速やかに変更します)。当情報を利用してコンパイラを開発していただけるとありがたいです。

  • レジスタ本数を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