1. string Namespace = "";
//指明指令集系统名称
使用示例:
let Namespace = "Mips";
一般在Class Formats中直接指出,例如:
2. dag OutOperandList;
//包含MI def操作数列表的dag。
使用示例:
let OutOperandList = outs;
一般在Class Formats中直接指出,例如:
outs来自于MipsInst:
赋值也有多种类型 ,主要是和指令的操作数有关:
3. dag InOperandList;
//包含MI使用操作数列表的dag。
使用以及数据流向同OutOperandList
使用上同样由多种形式,主要是和指令的操作数有关:
4. string AsmString = "";
//用于打印指令的.s格式,由用户给出的指令操作变换而来
主要是和指令的操作数以及指令的操作有关
因为指令的操作数不同,也还有如下的形式:
!strconcat(opstr, "\t$rt, $rs, $imm16")
!strconcat(opstr, "\t$rt, $imm16")
!strconcat(opstr, "\t$$zero, $rs, $rt")
5.list<dag> Pattern;
//如果我们知道此指令,则设置为该指令的DAG模式,否则未初始化,由用户给出的指令操作变换而来
//最终的状态将最终从指令模式中自动推断出来。
因为指令的操作数不同,也还有如下的形式:
[(set RO:$rd, (OpNode RO:$rs, RO:$rt))]
[(set RO:$rt, (OpNode RO:$rs, imm_type:$imm16))]
[(set RO:$rd, (OpNode RO:$rt, PF:$shamt))]
[(set RO:$rd, (OpNode RO:$rt, GPR32Opnd:$rs))]
6.list<Register> Uses = [];
//默认为不使用非操作数寄存器
7.list<Register> Defs = [];
//默认不修改任何非操作数寄存器
在mips中貌似只有乘法除法等指令由这个字段
8.list<Predicate> Predicates = [];
//谓词列表,这些谓词将转换为isel matching code
9.int Size = 0;
编码指令的大小;如果无法从操作码中确定大小,则为零。
10. string DecoderNamespace = "";
该指令所在的“名称空间”,位于存在多个ISA名称空间的目标(如ARM)上。
同1. string Namespace = "";
11.int CodeSize = 0;
代码大小,用于选择指令。
// Added complexity passed onto matching pattern.
12. int AddedComplexity = 0;
增加了传递给匹配模式的复杂性。
13. bit isReturn = 0;
是否是返回指令
14.bit isBranch = 0;
是否是跳转指令
15.bit isIndirectBranch = 0;
是否是间接分支
16.bit isCompare = 0;
是否是比较指令
17.bit isMoveImm = 0;
是否是立即移动指令
18.bit isBitcast = 0;
是否是Bitcast指令
19.bit isSelect = 0;
是否是选择指令
20.bit isBarrier = 0;
控制流是否可以fall through这条指令
21.bit isCall = 0;
是否是调用指令
22.bit isAdd = 0;
是否是add指令
13-22都是指令类型
23.bit canFoldAsLoad = 0;
是否可以将其折叠为简单的内存操作数?
24.bit mayLoad = ?;
是否可以读取内存
25.bit mayStore = ?;
是否可以写入内存
26.bit isConvertibleToThreeAddress = 0;
这个2地址指令是否可以升级
27.bit isCommutable = 0;
这3个操作数指令是可交换的吗?
28.bit isTerminator = 0;
这是基本块终止符的一部分吗?
29.bit isReMaterializable = 0;
该指令可重新实现吗?
30.bit isPredicable = 0;
此指令是否可预测?
31.bit hasDelaySlot = 0;
该指令是否有延迟槽?
32.bit usesCustomInserter = 0;
伪指令需要特殊帮助。
33.bit hasPostISelHook = 0;
在isel之后被目标挂钩“调整”。
34.bit hasCtrlDep = 0;
该指令是否按r/w 控制流链?
35.bit isNotDuplicable = 0;
复制此指令是否不安全
36.bit isConvergent = 0;
该指令收敛吗
37.bit isAsCheapAsAMove = 0;
是否比移动指令更加廉价
38.bit hasExtraSrcRegAllocReq = 0;
来源是否有特殊的regalloc要求
39.bit hasExtraDefRegAllocReq = 0;
Def有特殊的regalloc要求吗?
40.bit isRegSequence = 0;
此指令是一种reg序列吗?如果是,请确保重写TargetInstrInfo :: getRegSequenceLikeInputs。
41.bit isPseudo = 0;
是伪指令吗?如果是,则没有[MC] CodeEmitter内容的编码信息。
42.bit isExtractSubreg = 0;
这是一种提取subreg吗?如果是,需要覆盖TargetInstrInfo :: getExtractSubregLikeInputs。
43.bit isInsertSubreg = 0;
这是一种插入subreg吗?如果是,请确保覆盖TargetInstrInfo :: getInsertSubregLikeInputs。 //
44.bit hasSideEffects = ?;
副作用标志,设置后,标志的含义如下:hasSideEffects-指令具有任何指令的操作数或其他标志都未捕获的副作用。
45.bit isCodeGenOnly = 0;
该指令是“真实”指令(具有不同的机器编码),还是用于代码生成建模目的的伪指令。
FIXME:目前,这与上面的isPseudo有所不同,因为仅代码生成的指令仍可以(并且经常这样做)仍具有与之关联的编码信息。一旦将所有它们迁移到真正的伪指令(在打印机/发射器之前降低为真实指令),我们就可以删除此属性,而只需使用isPseudo。
预期用途是:isPseudo:没有编码信息,最晚在降级为MCInst时应进行扩展。 isCodeGenOnly:具有编码信息,并且可以不更改地传递给CodeEmitter,但是重复了规范指令定义的编码,因此在构造汇编匹配表时应将其忽略。
46.bit isAsmParserOnly = 0;
此指令是汇编程序解析器使用的伪指令。
47.bit hasNoSchedulingInfo = 0;
不希望查询该指令的调度延迟,因此即使对于完整的调度模型,也不需要任何调度信息。
48.InstrItinClass Itinerary = NoItinerary;
用于调度的执行步骤。
49.list<SchedReadWrite> SchedRW;
从TargetSchedule.td获得的调度信息。
50.string Constraints = "";
OperandConstraint,例如$ src = $ dst。
51.string DisableEncoding = "";
不应被编码到输出machineinstr中的操作数名称列表(例如“ $ op1,$ op2”)。
52.string PostEncoderMethod = "";
53.string DecoderMethod = "";
53.bit hasCompleteDecoder = 1;
指令解码器方法是否能够完全确定给定指令是否有效。如果指令的TableGen定义指定位模式A ?? B,其中A和B是静态位,则hasCompleteDecoder标志说明解码器方法是否完全处理了??。空格,即它是否是指令有效性的最终仲裁者。如果不是,则当解码器方法失败时,解码器尝试继续解码。这允许处理编码不完全正交的情况。示例:*带有位模式0b0000的InstA ????,*带有位模式0b000000的InstB?但是关联的解码器方法DecodeInstB()在??时返回Fail是0b00或0b11。解码器尝试首先将匹配InstA和InstB位模式的位模式解码为InstB(因为这是最具体的编码)。在默认情况下(hasCompleteDecoder = 1),当DecodeInstB()返回Fail时,位模式将被拒绝。通过在InstB中将hasCompleteDecoder设置为0,可通知解码器DecodeInstB()无法确定是否所有可能的Δε值。是
有效与否。如果DecodeInstB()返回Fail,则解码器也将尝试将位模式解码为InstA。
54.bits<64> TSFlags = 0;
特定于目标的标志。这将成为TargetInstrDesc中的TSFlags字段。
55.string AsmMatchConverter = "";
汇编器解析器支持的name
56.string TwoOperandAliasConstraint = "";
TwoOperandAliasConstraint-使TableGen能够为三个操作数指令自动生成两个操作数的匹配器实例别名。 例如,臂指令“ add r3,r3,r5”可以写为“ add r3,r5”。 约束的形式与绑定操作数约束相同。 例如,“ $ Rn = $ Rd”。
57.string AsmVariantName = "";
用于此指令的汇编程序变体名称。 如果指定,则此变体仅在MatchTable中显示指令。 如果未指定,则将根据AsmString确定汇编程序变体
58.bit UseNamedOperandTable = 0;
如果设置,则可以通过TableGen生成的getNamedOperandIdx()函数查询此指令的操作数索引。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2uun2c5yuuskc