PIC后端:16位寄存器/返回类型

时间:2016-09-12 17:59:06

标签: llvm microcontroller pic

我开始为16位PIC单片机(PIC24,dsPIC30 / 33)编写LLVM后端。复制并重命名来自Lanai的东西,删除很多,添加一些并使后端知道clang我可以翻译

short foo(void) { return 6*7; }

mov #0x2A, W0
ret

这正是我想要的。

DataLayout设置为" e-m:e-p:16:16-i16:16-a:0:16-n16-S16"寄存器定义为

def GPR : RegisterClass<"PIC", [i16], 16, (sequence "W%u", 0, 15)>;

并添加为

addRegisterClass(MVT::i16, &PIC::GPRRegClass);

但是,当我将上述返回类型更改为&#39; int&#39;时,我得到&#34; 返回操作数#1的未处理类型i16 &#34;这很奇怪,因为i16是目前处理的唯一类型:

def RetCC_PIC16 : CallingConv<[
  // Use W0 to return 16-bit value.
  CCIfType<[i16], CCAssignToReg<[W0]>>
]>;

编译在LowerReturn()

中止
CCInfo.AnalyzeReturn(Outs, RetCC_PIC16);

我错过了什么?我还需要做些什么来告诉clang / llvm使用哪个int大小以及如何返回它?

标识符GPRRegClass来自哪里,它实际上是否正确?

1 个答案:

答案 0 :(得分:1)

解决:我正确设置int的大小后,这个消失了;见How to tell clang that my LLVM Target should use 16-bit 'int'?