前回のRISC-V LLVM 32ビット版命令生成には一つ問題があり、そのままパッチを当ててしまうとCompressed ISA(16ビット版 RISC-V ISA)を生成してしまう点にある。
現状自作CPUも自作ISSもCompressed ISAには対応していないので、32bit版命令しか生成しないように変更する。
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をビルドしているのだが、シミュレーションを実行しても最後まで通過しない。ここは解析が必要だ。