FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

RISC-V LLVM を用いたベンチマークビルドの方法(Compressed ISAを生成させない方法)

f:id:msyksphinz:20170325154038p:plain

前回のRISC-V LLVM 32ビット版命令生成には一つ問題があり、そのままパッチを当ててしまうとCompressed ISA(16ビット版 RISC-V ISA)を生成してしまう点にある。

現状自作CPUも自作ISSもCompressed ISAには対応していないので、32bit版命令しか生成しないように変更する。

msyksphinz.hatenablog.com

riscv-clangのリポジトリを変更する。

diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 156ee24..1fede05 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1552,6 +1552,11 @@ static void getRISCVTargetCPU(const ArgList &Args,
     CmdArgs.push_back("-target-feature");
     CmdArgs.push_back("+rv64");
     parseRISCVExtensions(MArch.drop_front(4), CmdArgs);
+  }else if(Triple.getArch() == llvm::Triple::riscv) {
+    CmdArgs.push_back("-target-feature");
+    CmdArgs.push_back("+rv32");
+    CmdArgs.push_back("-target-feature");
+    CmdArgs.push_back("-rv64");
   }else{
     //default to RV64I
     CmdArgs.push_back("-target-feature");
@@ -9184,6 +9189,15 @@ void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
     CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
     break;
   }
+  case llvm::Triple::riscv: {
+       // for riscv-tools in sifive freedom-e-sdk
+       CmdArgs.push_back("-march=rv32ima");
+       CmdArgs.push_back("-mabi=ilp32");
+       // for riscv-tools in sifive freedom/rocket-chip/riscv-tools
+       //CmdArgs.push_back("-m32");
+       //CmdArgs.push_back("-msoft-float");
+     break;
+  }
   }

   Args.AddAllArgs(CmdArgs, options::OPT_I);

つまり、"-march=rv32imac" だったのが、"-march=rv32ima"に変更するので、Compressed ISAが生成されなくなる。 これでCoremarkをビルドしているのだが、シミュレーションを実行しても最後まで通過しない。ここは解析が必要だ。