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

LLVM:如何指定进位标志算法?,llvm,llvm-ir,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))]> {} def ADD_reg3:instreg3简单 {} 太好了!现在我想添加两个“长”数字 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))]>
{}
def ADD_reg3:instreg3简单
{}
太好了!现在我想添加两个“长”数字

LLVM似乎足够酷,可以使用每个数字两个寄存器自动拆分。现在,我的全新编译器抱怨说,它无法为更高的字选择“adde”指令。我知道我还需要'addc'变体,而不是较低单词的'add'

  • 如何指定addc和adde指令? 我是否必须首先定义进位资源以及如何在模式中使用它,或者它都是隐式的,我可以将“add”替换为“addc/e”吗

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

我试着把它读了一遍,但发现简单的例子缺少多词算术,而现实世界的代码太复杂了,我看不出发生了什么

更新:

我发现我可以像上面一样为“adde”(使用操作码ADDC)定义一条指令。现在llvm抱怨缺少“addc”。当我将“add”模式更改为“addc”时,多字指令工作。。。但现在,由于缺少“添加”,无法再选择单字指令


因此,问题归结为:如何将“add”映射到“addc”,或将两者映射到其他任何东西?

部分解决:我通过定义

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)>;
...
def:Pat;
def:Pat;
...
对于所有类型的ADD_*和SUB_*指令定义,所有这些指令定义都在其模式中使用addc/subc,并处理单字和低级多字数学。上面的单词也有类似的版本(使用adde/sube)


不幸的是,对于每个新的加法/减法变量,我都必须这样做。我怀疑还有更聪明的方法可以做到这一点

部分解决:我通过定义

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)>;
...
def:Pat;
def:Pat;
...
对于所有类型的ADD_*和SUB_*指令定义,所有这些指令定义都在其模式中使用addc/subc,并处理单字和低级多字数学。上面的单词也有类似的版本(使用adde/sube)

不幸的是,对于每个新的加法/减法变量,我都必须这样做。我怀疑还有更聪明的方法可以做到这一点