ベンチマークがビルドできるようになったので、ISSのデコード回路に新しい64ビット命令を追加していこう。
今回、せっかくなので64ビットアーキテクチャ用に新しいデコードテーブルを用意することにした。
新しいデコードテーブルには、命令セットリファレンスマニュアルに書いてある全ての命令を挿入することにする。
$arch_table[ 0] = Array['add d[15:11],d[25:21],d[20:16]', '000000', 'XXXXX', 'XXXXX', 'XXXXX', '00000', '100000', 'ALU', Array[ 'DST_RD', 'R1_RS', 'R2_RT', 'OP_SIGN_ADD' ], Array['OPCODE', 'FUNCT', 'shamt'], ] $arch_table[ 0] = Array['abs.fmt f[10:6],f[15:11]' $arch_table[ 0] = Array['add d[15:11],d[25:21],d[20:16]' $arch_table[ 0] = Array['add.fmt f[10:6],f[15:11],f[20:16]' $arch_table[ 0] = Array['addi d[20:16],d[25:21],h[15:0]' $arch_table[ 0] = Array['addiu d[20:16],d[25:21],h[15:0]', '001001', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ 'DST_RT', 'R1_RS', 'IMM', 'OP_USIGN_ADD' ], Array['OPCODE']] $arch_table[ 0] = Array['addiupc d[25:21],h[18:0]' $arch_table[ 0] = Array['addu d[15:11],d[25:21],d[20:16]', '000000', 'XXXXX', 'XXXXX', 'XXXXX', '00000', '100001', 'ALU', Array[ 'DST_RD', 'R1_RS', 'R2_RT', 'OP_USIGN_ADD' ], Array['OPCODE', 'FUNCT', 'SHAMT']] $arch_table[ 0] = Array['align d[15:11],d[25:21],d[20:16],d[7:6]' $arch_table[ 0] = Array['dalign d[15:11],d[25:21],d[20:16],d[8:6]' $arch_table[ 0] = Array['alnv.ps f[10:6],f[15:11],f[20:16],d[25:21]' $arch_table[ 0] = Array['aluipc d[25:21],h[15:0]' $arch_table[ 0] = Array['and d[15:11],d[25:21],d[20:16]', '000000', 'XXXXX', 'XXXXX', 'XXXXX', '00000', '100100', 'ALU', Array[ 'DST_RD', 'R1_RS', 'R2_RT', 'LOGIC_AND' ], Array['OPCODE', 'FUNCT', 'SHAMT']] $arch_table[ 0] = Array['andi d[20:16],d[25:21],h[15:0]', '001100', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ 'DST_RT', 'R1_RS', 'UIMM','LOGIC_AND' ], Array['OPCODE']] $arch_table[ 0] = Array['aui d[20:16],d[25:21],h[15:0]', '001111', 'XXXXX!=00', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ ], Array['OPCODE', 'RS']] $arch_table[ 0] = Array['daui d[20:16],d[25:21],h[15:0]', '011101', 'XXXXX!=00', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ ], Array['OPCODE', 'RS']] $arch_table[ 0] = Array['dahi d[20:16],d[25:21],h[15:0]', '000001', 'XXXXX', '00110', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ ], Array['OPCODE', 'RT']] $arch_table[ 0] = Array['dati d[20:16],d[25:21],h[15:0]', '000001', 'XXXXX', '11110', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ ], Array['OPCODE', 'RT']] $arch_table[ 0] = Array['auipc d[25:21],h[15:0]', '111011', 'XXXXX', '11110', 'XXXXX', 'XXXXX', 'XXXXXX', 'ALU', Array[ ], Array['OPCODE', 'RT']] $arch_table[ 0] = Array['b h[15:0]', '000100', '00000', '00000', 'XXXXX', 'XXXXX', 'XXXXXX', 'BRANCH', Array[ 'IMM', 'PC_REL' ], Array['OPCODE', 'RS', 'RT']] $arch_table[ 0] = Array['bal h[15:0]', '000001', '00000', '10001', 'XXXXX', 'XXXXX', 'XXXXXX', 'BRANCH', Array[ 'DST_31', 'IMM', 'PC_REL' ], Array['OPCODE', 'RS', 'RT']] $arch_table[ 0] = Array['balc h[25:0]', '111010', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'BRANCH', Array[ ], Array['OPCODE']] $arch_table[ 0] = Array['bc h[25:0]', '110010', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'BRANCH', Array[ ], Array['OPCODE']] $arch_table[ 0] = Array['bc1eqz d[20:16],h[15:0]', '010001', '01001', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'BRANCH', Array[ ], Array['OPCODE', RS]] $arch_table[ 0] = Array['bc1nez d[20:16],h[15:0]', '010001', '01101', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXXX', 'BRANCH', Array[ ], Array['OPCODE', RS]]
総計で、350近くある命令を新たに追加した。しかし、これはまだ浮動小数点の命令を一つにまとめた状態なので、さらに多くの命令が追加されるようになる。これは大変だ。。。 しかも、これでちゃんと命令が正しくデコードできることを全ての命令について確認しなければならない。これは大変な作業だなあ。 まずは、浮動小数点の命令を除き、全ての命令のデコードテーブルを作成した。次はこのデコードテーブルを完成させることと、中身の実装を追加していくことだ。