2017-04-20 11 views
0

私はちょうど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」をマッピングするにはどうしたらよいですか?

答えて

0

PARTIALLY解決しよう:私は、単一の単語がそのパターンでADDC/SUBCを使用するすべてのそれらの命令の定義、* ADD_ *とSUB_のすべての種類の

def : Pat<(add GPR:$Wb, GPR:$Ws), (ADD_reg3 GPR:$Wb, GPR:$Ws)>; 
def : Pat<(add GPR:$Wb, uimm5:$lit), (ADD_reg2_lit5 GPR:$Wb, uimm5:$lit)>; 
... 

を定義することにより、加算/減算とハンドルハッキングの両方一単語以下の複数単語の数学。上の言葉にも同様のバージョンがあります(adde/subeを使用)。

残念ながら、新しい加算/減算バリアントごとにこれを行う必要があります。私はこれを行うより巧妙な方法があると思う!

関連する問題