- 指明操作数的编号
class SDTypeConstraint<int opnum> {
int OperandNum = opnum;
}
- 指明特定操作数的类型,表示第opnum号操作数是vt这种类型
class SDTCisVT<int OpNum, ValueType vt> : SDTypeConstraint<OpNum> {
ValueType VT = vt;
}
- 约定两个操作数有相同的类型
class SDTCisSameAs<int OpNum, int OtherOp> : SDTypeConstraint<OpNum> {
int OtherOperandNum = OtherOp;
}
- 描述DAG类型的要求,numresults表示结果操作数数量,numoperands表示输入操作数数量
class SDTypeProfile<int numresults, int numoperands,
list<SDTypeConstraint> constraints> {
int NumResults = numresults;
int NumOperands = numoperands;
list<SDTypeConstraint> Constraints = constraints;
}
- 结合上面的代码,下面作出一个示例:
def SDTIntBinOp : SDTypeProfile<1, 2, [ // add, and, or, xor, udiv, etc.
SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisInt<0>
]>;
这个示例表示定义了一个约束,这个约束有1个结果操作数,2个输入操作数。SDTCisSameAs<0,1>表示0号操作数与一号操作数类型相同,SDTCisSameAs<0,2>表示0号操作数与2号操作数类型相同,SDTCisInt<0>表示0号操作数位整型。
- 定义匹配SDNode,opcode操作码代号
class SDNode<string opcode, SDTypePr