MIPSには、大昔から64ビットのアーキテクチャ仕様であるMIPS64が存在する。この対応を考えてみよう。
ベンチマークプログラムの64ビット命令対応
まずは、ベンチマークの移植から考えてみる。
まず、MIPS64R6の対応するコードを出すためには、イマジネーションのコンパイラが必要だ。
あと、リンカスクリプトを変更することでスタートアップアドレスを変更した。
SECTIONS { - .data 0x7F000000 : { *(.data) } + .data 0xFFFFFFFF7F000000 : { *(.data) } _gp = ALIGN(16); _sp = ALIGN(16) + 0x3FF8; .bss : { *(.bss) } - .text 0x80000000 : { + .text 0xFFFFFFFF80000000 : { *(.text) } - .text.reset 0xbfc00000 : { + .text.reset 0XFFFFFFFFBFC00000 : { *(.text.reset) } }
シミュレータの64ビット命令対応
次にISSの64ビット命令対応を考えてみよう。基本的には、PCと汎用レジスタ、メモリマップのアドレスを変更すればうまく行くはずだ。
新しくmips64というブランチを作って作業を始めた。基本的にアドレスの幅を64ビットに変更しただけで、あとはとりあえず何もしていない。
ベンチマークをシミュレートしてみる。
<BSF_Global: 0x7f000010 _GLOBAL_OFFSET_TABLE_ <BSF_Global: 0x7f000214 seed2_volatile <BSF_Global: 0x7f000000 default_num_contexts <Finish loading global variable table> StartDebug max_step=65535 <= curr_step(0) + stepCount(65535) Result Max_step=65535 0 : [bfc00000] 3c1c0000 : lui r28,0x0000 r28<=00000000 1 : [bfc00004] 3c017f00 : lui r01,0x7f00 r01<=7f000000 <Error: instruction is not decoded. [bfc00008]=679cffff
変数のアドレスなどは、32ビット表記のままだが一応バイナリのロードには成功した。次は、64ビットの命令への対応だ。