我想添加对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是否也存在?这是什么意思 ?
- 最后 - 我做错了什么?为什么我不能得到第二个结果?为什么我一直都会遇到这个错误?