FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

templateを使って演算命令を共通化する

ISSで64ビット対応をしていると、32ビットですでに実装しているのに、同じものを64ビットで再度実装しなければならないことがある。 加減算ならまだしも、ロードストアや複雑な演算で同様なルーチンを何個もコピーしていると面倒なので、templateを使って共通化していくことにした。

github.com

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ビット符号無し整数を用意した。

d.hatena.ne.jp

あとは、ロードストアなどもこれに乗っ取って実装していこう。