私はちょうどLLVM:キャリーフラグ算術を指定する方法は?
def ADD_reg3 : InstReg3Simple<0b01000, (outs GPR:$Wd), (ins GPR:$Wb, GPR:$Ws),
"add\t$Wb, $Ws, $Wd",
[(set GPR:$Wd, (add GPR:$Wb, GPR:$Ws))]>
{}
グレートを使用して2つのレジスタを追加するために管理します!今は2つの「長い」数字を追加したいと思います。
LLVMは、番号ごとに2つのレジスタを使用してこれを自動的に分割するのに十分なようです。今、私の新しいコンパイラは、上位の単語に対して 'adde'命令を選択できないという不満を抱いています。私は、下位の単語には "add"の代わりに "addc"を使う必要があることを知っています。
addcおよびadde命令の指定方法は? 最初にキャリーリソースを定義する必要がありますか、それをパターンでどのように使用するのですか、それとも暗黙的なものなのですか? 'addc/e'を 'add'するだけですか?
私のプロセッサには、ADDとADDCのオペコードしかありません。どちらもキャリーを生成しますが、ADDCだけでもそれを使用します。 addとaddcが同じADDオペコードにマッピングされるべきであることをLLVMに伝えるにはどうすればよいですか?
私はこれを読んしようとしたが、実世界のコードは、私は何が起こっているかを見ることのためにあまりにも複雑である一方、簡単な例としては、マルチワード算術演算の短い停止することがわかりました。
UPDATE:
私はちょうど上記のように(オペコードADDCを使用して)「ADDE」の命令を定義することができることが分かりました。今、llvmは「addc」がないことについて不平を言います。 'add'パターンを 'addc'に変更すると、複数ワードの命令が動作します...しかし、今では、「add」がないために、単一ワード命令はこれ以上選択できません!
次のようなことが書かれています。「addc」に「add」をマッピングするにはどうしたらよいですか?