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