LLVM:如何指定进位标志算术?

时间:2017-04-20 18:13:31

标签: llvm llvm-ir

我设法使用

添加两个寄存器
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))]>
{}

大!现在我想添加两个长的&#39;号。

似乎LLVM足够酷,可以使用每个数字的两个寄存器自动拆分它。现在,我的全新编译器抱怨它无法选择“adde”。指示更高级的单词。我知道我还需要“添加”#c;变体而不是&#39;添加&#39;对于较低的单词。

  • 如何指定addc和adde说明? 我是否必须首先定义一个进位资源,如何在模式中使用它,或者它是否都是隐含的,我可以直接交换&#39;添加&#39;对于&#39; addc / e&#39;?

  • 我的处理器只有ADD和ADDC操作码。两者都生成进位,但只有ADDC也使用它。如何判断LLVM是否应该将add和addc映射到相同的ADD操作码(使用不用于添加的进位)?

我试着阅读这篇文章,但发现简单的例子没有多字算术,而现实世界的代码太复杂了,我无法看到发生了什么。

更新:

我发现我可以为'adde&#39;定义一条指令。 (使用操作码ADDC)就像上面一样。现在,llvm抱怨失去了addc&#39;。当我更改&#39;添加&#39;模式到&#39; addc&#39;,多字教学有效...但是现在,由于缺少“添加”而无法再选择单字指令!

归结为:我如何映射&#39;添加&#39; to to addc&#39;或者两者兼顾其他什么东西?

1 个答案:

答案 0 :(得分:0)

部分解决:我通过定义

来攻击单字加/减
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)>;
...

对于所有类型的ADD_ *和SUB_ *指令定义,所有这些都在其模式中使用addc / subc并处理单字和低字多字数学。上层单词有类似的版本(使用adde / sube)。

不幸的是,我必须为每个新的加/减变量执行此操作。我怀疑有更聪明的方法可以做到这一点!