2016-09-12 5 views
0

16ビットPICマイクロコントローラ(PIC24、dsPIC30/33)のLLVMバックエンドの作成を開始しました。多くを取り除く、ラナイからのものをコピーして名前を変更した後、いくつかと私は私が望んでいた正確に何であるPICバックエンド:16ビットレジスタ/戻り型

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

mov #0x2A, W0 
ret 

を翻訳することができ打ち鳴らすことが知られているバックエンドを作るの追加。

DataLayoutが "EM:EP:16:16-I16:16:0:16-N16-S16" に設定され、レジスタは

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

として定義され、

として添加されます

:私は「INT」に上記の戻り値の型を変更したとき
addRegisterClass(MVT::i16, &PIC::GPRRegClass); 

はしかし、私は、I16は、現在処理だけタイプですので、奇妙な「戻りオペランド#1は、型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はどこから来ていますか、実際には正しいですか?

答えて