2015-09-26 58 views
1

我想添加對llvm backend(llc)中一個新的arch的支持。不過,我發現難以添加一個新的SDNode,它有2個結果。我在UMUL/SMUL有2個結果(第二個是Y)的SPARC弓鋸,使他們定義:如何在llvm中構建新的SDNode?

let Defs = [Y] in { 
    defm UMUL : ... 
    defm SMUL : ... 
} 

let Uses = [Y], ... in 
    def RDY : ... 

,並在選擇功能,它看起來像:

SDNode *Mul = CurDAG->getMachineNode(Opcode, dl, MVT::i32, MVT::Glue, 
            MulLHS, MulRHS); 
// The high part is in the Y register. 
return CurDAG->SelectNodeTo(N, SP::RDY, MVT::i32, SDValue(Mul, 1)); 

所以他們使用結果1 - 我認爲是Y ...


在我的情況下,我有一個影響cc位的指令。 所以我試圖用同樣的方式。我在Xinstr中定義了:

def SUBCri : ...>{ 
    let Defs = [CRZ]; 
} 

。 。

let Uses = [CRZ] in { 
    def BRC_Z : ... (outs), (ins target:$dst), 
} 

,並在選擇功能:

SDVTList VTs = CurDAG->getVTList(MVT::i32, MVT::Glue); 
    SDNode * CondCode = CurDAG->getMachineNode(X::SUBCri, dl, VTs, ops); 
    SDNode * ResNode = CurDAG->SelectNodeTo(Node, X::BRC_Z, MVT::Other, Dst, 
      SDValue(CondCode, 1)); 

,但我得到了一個錯誤:

Assertion `NumMIOperands >= II.getNumOperands() && NumMIOperands <= II.getNumOperands() + II.getNumImplicitDefs() + NumImpUses && "#operands for dag node doesn't match .td file!"' failed. 

所以我的問題是:

  1. 什麼纔是正道定義一個SDNode?
  2. SDVTList VTs是什麼意思?這是結果嗎? (SDVTList VTs)的順序是什麼意思?
  3. 什麼是OpsArray?這是投入嗎?插入輸入的正確順序是什麼?我看到在「countOperands」函數中,他們檢查是否最後一個是膠水。這是什麼意思膠水是最後?在同一個函數中,他們檢查MVT :: Other是否也存在?這是什麼意思 ?
  4. 最後 - 我做錯了什麼?爲什麼我不能得到第二個結果?爲什麼我一直都會遇到這個錯誤?

回答

2

這應該是一個評論,但我沒有代表。一些可能有幫助的提示:

  • VT代表ValueType。 LLVM需要知道每個SDNode返回值的類型。通過將VT傳遞給getMachineNode,可以創建一個新的SDNode,該SDNode返回與SDVTList中的值一樣多的值,並帶有指定的類型。

  • 「膠水」是一種特殊的ValueType,實際上並不包含值。它僅用於確保在指令調度發生時兩個粘合的SDNode不會分離。

  • 「ops」確實是輸入的輸入。

  • 輸入和返回值的順序應該與TableGen中指定的順序完全一致。

  • 我不確定這一點,但我不認爲Defs轉化爲隱式返回值。您可能必須手動創建CopyFromReg節點,才能獲取寫入的寄存器。

  • MVT ::其他代表一個「鏈」,一種確保副作用的指令不會相對於彼此重新排序的方法。

Do do閱讀doxygen文檔,他們很擅長解釋各個功能(即使在大圖中缺少一點)。

從這裏開始嘗試:http://llvm.org/docs/doxygen/html/classllvm_1_1SelectionDAG.html