2017-04-20 36 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))]> 
{} 

大加兩個寄存器!現在我想添加兩個'長'數字。

看來,LLVM是足夠酷,可以自動分裂每個數字使用兩個寄存器。現在,我的全新編譯器抱怨它無法爲較高的單詞選擇'adde'指令。我知道我還需要'addc'變體,而不是'add'。

  • 如何指定addc和adde指令? 我必須首先定義一個進位資源,我該如何在模式中使用它,還是全是隱式的,我可以爲'addc/e'交換'add'嗎?

  • 我的處理器只有ADD和ADDC操作碼。兩者都生成進位,但只有ADDC也使用它。我怎麼能告訴LLVM add和addc應該映射到相同的ADD操作碼(帶進位未用於添加)?

我想讀這件事,但發現易例子停止短多字算術,而現實世界中的代碼是太複雜,我看到發生了什麼事情。

UPDATE:

我發現我可以定義爲「ADDE」(操作碼使用ADDC)就像以上的指令。現在llvm抱怨缺少'addc'。當我將「添加」模式更改爲「addc」時,多字指令可以工作......但是現在,由於缺少「添加」,單字指令不能再被選中!

所以歸結爲:我怎樣才能將'add'映射到'addc',或者同時映射到其他任何東西?

回答

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)。

不幸的是,我必須爲每個新增加/減去變量做這個。我懷疑有更聰明的方法來做到這一點!