LLVM后端移植--Tablegen指令描述Instruction类解读

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值