FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

MIPSアーキテクチャ64bitへの対応を検討する(ISSのデコード回路の追加)

ベンチマークがビルドできるようになったので、ISSのデコード回路に新しい64ビット命令を追加していこう。

msyksphinz.hatenablog.com

今回、せっかくなので64ビットアーキテクチャ用に新しいデコードテーブルを用意することにした。

github.com

新しいデコードテーブルには、命令セットリファレンスマニュアルに書いてある全ての命令を挿入することにする。

$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近くある命令を新たに追加した。しかし、これはまだ浮動小数点の命令を一つにまとめた状態なので、さらに多くの命令が追加されるようになる。これは大変だ。。。 しかも、これでちゃんと命令が正しくデコードできることを全ての命令について確認しなければならない。これは大変な作業だなあ。 まずは、浮動小数点の命令を除き、全ての命令のデコードテーブルを作成した。次はこのデコードテーブルを完成させることと、中身の実装を追加していくことだ。