当前位置: 首页 > news >正文

网站建设广州哪家好wordpress更改php版本

网站建设广州哪家好,wordpress更改php版本,百度主动提交工具 wordpress,无视风险安装下载app软件llvm后端之td定义指令信息 引言1 定义指令2 定义Operand3 定义SDNode4 PatFrags4.1 ImmLeaf4.2 PatLeaf 5 ComplexPattern6 谓词条件7 理解dag 引言 llvm后端通过td定义指令信息,并通过dag匹配将IR节点转换为平台相关的指令。 1 定义指令 td通过class Instructio…

llvm后端之td定义指令信息

  • 引言
  • 1 定义指令
  • 2 定义Operand
  • 3 定义SDNode
  • 4 PatFrags
    • 4.1 ImmLeaf
    • 4.2 PatLeaf
  • 5 ComplexPattern
  • 6 谓词条件
  • 7 理解dag

引言

llvm后端通过td定义指令信息,并通过dag匹配将IR节点转换为平台相关的指令。

1 定义指令

td通过class Instruction来定义指令,其各个字段意义如下:

  • OutOperandList:输出dag节点列表;
  • InOperandList:输入操作数节点列表;
  • AsmString:用于在“.s”文件中的汇编显示;
  • Pattern:用于指令选择匹配的dag列表;
  • Predicates:用于在指令选择阶段是否启用的条件判断;
  • Uses:指令引用的寄存器列表;
  • Defs:指令改写的寄存器列表;
  • Size:指令编码成二进制的长度,为0表示可变长度;
  • CodeSize:
  • Itinerary:按步骤方式的调度模式;
  • SchedRW:按资源使用的调度模式;
  • Constraints:约束条件,例如有些指令源寄存器与目的寄存器笔下相同,则$src = $dst;
  • TSFlags:

注:还有一个隐含的字段field bits Inst,该字段表示指令转换为二进制时bit位。例如RISCV里面为field bits<32> Inst。

2 定义Operand

Operand用于定义操作,相关字段如下:

  • Type:操作数类型,例如i8、i16、i32等;
  • PrintMethod:在class XXXInstPrinter中用于打印该操作数的成员函数,参数分别为const MCInst *MI、unsigned Op、raw_ostream &O。需要cpp实现;
  • EncoderMethod:在class XXXMCCodeEmitter中用于编码该操作数的成员函数,参数分别为const MCInst &MI、unsigned OpNo、SmallVectorImpl &Fixups、const MCSubtargetInfo &STI,返回值为unsigned,表示错误编号。需要cpp实现;
  • DecoderMethod:在class XXXDisassembler中用于解码该操作数的成员函数,参数分别为MCInst &Inst、uint64_t Imm、int64_t Address、const void *Decoder,返回值为DecodeStatus;
  • hasCompleteDecoder:
  • OperandType:操作数类型字符串,包括MCInstrDesc.h中定义的enum OperandType中,有些target会进行自定义。
  • OperandNamespace:操作数类型定义所在的namespace。默认为MCOI,即定义在MCInstrDesc.h中;
  • MIOperandInfo:子操作数片段。例如地址可能有基地址、偏移、scale等组成,为了可读性将其合并定义为addr;
  • MCOperandPredicate:在XXXAsmParser和XXXAsmPrinter发射该操作数有效的匹配前置条件的代码片段。代码片段可访问const MCOperand &MCOp;
  • ParserMatchClass:用于汇编解析的方法集合,类型为AsmOperandClass。

class AsmOperandClass用于生成汇编解析代码,其各个字段如下:

  • Name:操作数类型名称;
  • SuperClasses:操作数分类所属父类列表;
  • PredicateMethod:表示class XXXOperand的成员函数名称,该成员函数用于判断是否为该类型的操作数,不定义则为bool is%Name%() const;
  • RenderMethod:表示class XXXOperand的成员函数名称,该成员函数用于将该操作数添加到MCInst中,不定义则为void add%Name%Operands(MCInst &Inst, unsigned N) const;
  • ParserMethod:表示class XXXAsmParser的成员函数名称,用于解析该汇编操作数。函数原型为( OperandMatchResultTy )(OperandVector &Operands);
  • DiagnosticType:当XXXAsmParser解析失败时,触发的错误打印;
  • DiagnosticString:当该操作数被赋值一个非法值时,触发的错误打印;
  • IsOptional:为1表示为可选参数,为0为必须参数;
  • DefaultMethod:表示class XXXAsmParser的成员函数名称,当IsOptional时,该成员函数用于创建默认的该操作数,不定义则为std::unique_ptr< XXXOperand > default%Name%Operands() const;

3 定义SDNode

SDNode用于定义一个dag节点,它分别有如下重要参数:

  • opcode:SDNode的节点枚举;
  • typeprof:用于描述节点特性的SDTypeProfile类型;
  • props:节点属性列表,定义在SDNodeProperties.td文件中,对应源码enum SDNP。例如满足交换律、满足结合律、有边界影响;
  • sdclass:节点对应C++类型名称;

SDTypeProfile用于描述节点的特性,各个参数如下:

  • numresults:节点输出值数量;
  • numoperands:节点输入操作数数量;
  • constraints:节点输出/入的约束;

注:SDTypeConstraint用于描述节点的输入输出约束。例如SDTCisInt<2>表示第0个输出/入为int,假设节点numresults为1,numoperands为2,序号从0到2,前面一个为输出、后面两个为输入。

4 PatFrags

例如store节点包括unindexed store、normal store、trunc store等,怎么分别定义这些SDNode呢?这时PatFrags就派上用场,其主要的参数如下:

  • ops与frags:它表示将frags中的任何片段之一匹配成ops片段;
  • pred:启动该匹配的前置条件代码,输出布尔变量。该代码片段生成于XXXGenDAGISel.inc中,代码片段除了可以访问class XXXDAGToDAGISel,还可以访问一个临时变量SDNode *N;
  • xform:对节点的转换代码片段,类型为SDNodeXForm。默认为NOOP_SDNodeXForm,即不转换。

注:通常frags只有一项,因此td模板定义了PatFrag来表示这种情况。

class SDNodeXForm用于对节点的转换操作,例如在PatFrags匹配结束,输出的SDNode可以做一次转换、或者做封装、甚至替换。核心字段如下:

  • opc:可转换的节点,类型为SDNode。
  • xformFunction:转换代码片段,代码片段除了可以访问class XXXDAGToDAGISel,还可以访问一个临时变量SDNode *N;

4.1 ImmLeaf

ImmLeaf表示将一个常数叶子重新匹配、或者说重定义为一个新的节点,也就是立即数节点。用于取立即数操作。立即数节点是没有子节点可继续展开,所以在PatFrag中断ops参数由一个空的ops表示。其主要两个参数:

  • vt:表示节点的输出类型,例如i8、i16、i32等;
  • pred:表示可匹配的先决条件,为一段输出布尔的代码。代码片段除了可以访问class XXXDAGToDAGISel,还可以访问一个临时变量 Imm

4.2 PatLeaf

PatLeaf表示将一个无操作数节点重新匹配、或者说重定义为一个新的节点名称,PatLeaf是PatFrag子类。由于叶子节点没有子节点可继续展开,所以在PatFrag中断ops参数由一个空的ops表示。例如x86中如下定义:

... ...
def i32immSExt8  : ImmLeaf<i32, [{ return isInt<8>(Imm); }]>;
... ...
def i32immSExt8_su : PatLeaf<(i32immSExt8), [{return !shouldAvoidImmediateInstFormsForSize(N);
}]>;
... ...

注:与PatFrag类似,pred字段的代码片段除了可以访问class XXXDAGToDAGISel,还可以访问一个临时变量SDNode *N。

5 ComplexPattern

ComplexPattern可用于从节点中提前操作数。例如地址有基地址、偏移、scale等组成,这时ComplexPattern派上用场。其各个字段意义如下:

  • Ty:被提取、或者说匹配的节点类型;
  • NumOperands:需要提前的子操作数个数;
  • SelectFunc:表示class XXXDAGToDAGISel中用于提取操作的成员函数名称;
  • RootNodes:表示该提取操作在哪些根节点下有效。为空则没有限制;
  • Properties:表示被提取节点(而非根节点)的属性;

例如X86中,有如下定义:

def addr      : ComplexPattern<iPTR, 5, "selectAddr", [], [SDNPWantParent]>;

则X86DAGToDAGISel类中有如下函数实现:

//Parent - ComplexPattern中定义了SDNPWantParent属性;
//N - 被提取节点,类型为iPTR;
//后面的导出参数对应ComplexPattern中定义的5个需要提前的子操作数
bool X86DAGToDAGISel::selectAddr(SDNode *Parent, SDValue N, SDValue &Base,SDValue &Scale, SDValue &Index,SDValue &Disp, SDValue &Segment) {

6 谓词条件

谓词条件表示匹配或定义有效的前置条件。除了前面各个record中表示谓词的字段。还有一种定义谓词的通用方式,就是def的record多重继承class Requires< list < Predicate > preds >。其中Predicate定义的谓词一般访问Subtarget实现返回条件布尔值。

7 理解dag

http://www.yayakq.cn/news/70881/

相关文章:

  • 网站建设用语言广告设计怎么学
  • 东莞阳光网站网站后台灰色
  • 商务网站建设的一般流程是什么如何做文献ppt模板下载网站
  • 网站开发好不好大荔县住房和城市建设局网站
  • 南京的网站建设公司哪家好网站推广方法有几种
  • 杭州如何设计网站首页现在做推广有什么好的方法
  • 甘肃建设项目审批权限网站洪梅镇网站建设
  • seo搜索引擎优化费用seo优
  • 孝感房产网站建设聊天代理分销系统
  • dz网站模板 首页显示内容银川网站建设一条龙服务
  • 网站备案 seo标小智在线logo免费设计
  • 手机把网站做成软件网页设计入门教程电子书下载
  • 国外 素材 网站网站推广软件下拉管家
  • 徐闻网站开发公司网络营销策划方案内容
  • 做中小型网站最好的架构wordpress 手册主题
  • 做画册找什么网站nginx 做网站
  • 绍兴专业做网站网站备案号的区别
  • 中交通力建设股份有限公司网站表白网页生成
  • 成都商城网站建设国外专门做旅游攻略的网站
  • 企业网站建设对网络营销有哪些影响二级注册建造师信息查询官网入口
  • 网站优化策划方案电子商务网站建设与管理实验总结
  • 做网站平台公司高品质的网站开发
  • 盐城网站建设制作方案网站开发与维护前景
  • 校园网站怎么做HTML广东深圳房价
  • 怎么在网上找做网站的客户宜兴市的城乡建设管理局网站
  • 申请备案网站首页陕西网站建设的内容
  • 为什么网站建设还要续费wordpress页面调用子页面
  • 公司网站建设记哪个科目北大青鸟学费一览表
  • 如何做自己的个人网站男的做直播哪个网站好
  • 电子购物网站建设视频建设工程信息发布网站