FPGA開発日記

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

LLVMのバックエンドを作るための第一歩 (53. RV64 / RV32両方のサポート格闘中2)

f:id:msyksphinz:20190425001356p:plain

RV64の64ビットモードでLLVMアセンブラを生成できるように格闘している。とりあえずサンプルプログラムとして以下を用意した。

  • xlen64_func.cpp
int64_t func()
{
  int64_t a0 = 10;
  int64_t a1 = 20;
  int64_t ans = a0 + a1;

  return ans;
}

いろいろ奮闘して、やっと分かったのはlib/Target/MYRISCVX/MYRISCVXSEISelLowering.cppレジスタ定義を変えてやらなければならなかったこと。 以下を変更していないせいで常にレジスタが32ビットだった。

  • lib/Target/MYRISCVX/MYRISCVXSEISelLowering.cpp
diff --git a/lib/Target/MYRISCVX/MYRISCVXSEISelLowering.cpp b/lib/Target/MYRISCVX/MYRISCVXSEISelLowering.cpp
index 36dff05c5ea..877f234dc32 100644
--- a/lib/Target/MYRISCVX/MYRISCVXSEISelLowering.cpp
+++ b/lib/Target/MYRISCVX/MYRISCVXSEISelLowering.cpp
@@ -38,7 +38,7 @@ MYRISCVXSETargetLowering::MYRISCVXSETargetLowering(const MYRISCVXTargetMachine &
     : MYRISCVXTargetLowering(TM, STI) {
   //@MYRISCVXSETargetLowering body {
   // Set up the register classes
-  addRegisterClass(MVT::i32, &MYRISCVX::GPRRegClass);
+  addRegisterClass(MVT::i64, &MYRISCVX::GPRRegClass);
   addRegisterClass(MVT::f32, &MYRISCVX::FPR_SRegClass);
   addRegisterClass(MVT::f64, &MYRISCVX::FPR_DRegClass);

これで、どうにかこうにかRV64の命令が生成できるようになった。

        addi    x2, x2, -24
        .cfi_def_cfa_offset 24
        addi    x10, zero, 10
        sw      x10, 16(x2)
        addi    x10, zero, 20
        sw      x10, 8(x2)
        ld      x10, 16(x2)
        ld      x11, 8(x2)
        add     x10, x10, x11
        sw      x10, 0(x2)
        ld      x10, 0(x2)
        addi    x2, x2, 24
        ret