我想添加對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.
所以我的問題是:
- 什麼纔是正道定義一個SDNode?
- SDVTList VTs是什麼意思?這是結果嗎? (SDVTList VTs)的順序是什麼意思?
- 什麼是OpsArray?這是投入嗎?插入輸入的正確順序是什麼?我看到在「countOperands」函數中,他們檢查是否最後一個是膠水。這是什麼意思膠水是最後?在同一個函數中,他們檢查MVT :: Other是否也存在?這是什麼意思 ?
- 最後 - 我做錯了什麼?爲什麼我不能得到第二個結果?爲什麼我一直都會遇到這個錯誤?