ISSで64ビット対応をしていると、32ビットですでに実装しているのに、同じものを64ビットで再度実装しなければならないことがある。 加減算ならまだしも、ロードストアや複雑な演算で同様なルーチンを何個もコピーしていると面倒なので、templateを使って共通化していくことにした。
void InstEnv::MIPS64_INST_ADD (Word_t inst_hex) { ... Word_t res = InstOps::IntAdd<Word_t> (rs1_val, rs2_val); ... } void InstEnv::MIPS64_INST_DADD (Word_t inst_hex) { ... DWord_t res = InstOps::IntAdd<DWord_t> (rs1_val, rs2_val); ... }
型を変更するだけで、演算を拡張できるようになる。また、浮動小数点演算の場合にも、演算表現を統一できるようになると考えている。
今はまだ実装していないけれども。。。
void InstEnv::MIPS64_INST_ADD_S (Word_t inst_hex) { } void InstEnv::MIPS64_INST_ADD_D (Word_t inst_hex) { } void InstEnv::MIPS64_INST_ADD_PS (Word_t inst_hex) { }
このために、演算専用のクラスと関数を用意した。
template <class T> static T InstOps::IntAdd (T data1, T data2) { return = data1 + data2; } template static Word_t InstOps::IntAdd (Word_t data1, Word_t data2); template static DWord_t InstOps::IntAdd (DWord_t data1, DWord_t data2); template static UDWord_t InstOps::IntAdd (UDWord_t data1, UDWord_t data2);
分割コンパイルするので、実装をヘッダに追加している。今回は、32ビット符号あり整数、64ビット符号あり整数、64ビット符号無し整数を用意した。
あとは、ロードストアなどもこれに乗っ取って実装していこう。