以下の内容はhttps://msyksphinz.hatenablog.com/entry/2019/08/26/013000より取得しました。


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



以上の内容はhttps://msyksphinz.hatenablog.com/entry/2019/08/26/013000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14