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

不会编程能做网站吗做网站都有什么成本

不会编程能做网站吗,做网站都有什么成本,seo外链购买,wordpress路由重写事例4.1.4. DAG合并与合法化 来自SelectionDAGBuilder的SelectionDAG输出还不能进行指令选择#xff0c;必须通过额外的转换——显示在上图。在指令选择前应用的遍序列如下#xff1a; 匹配一组节点#xff0c;在有利时使用更简单的构造来替换它们#xff0c;DAG合并遍优化Se…4.1.4. DAG合并与合法化 来自SelectionDAGBuilder的SelectionDAG输出还不能进行指令选择必须通过额外的转换——显示在上图。在指令选择前应用的遍序列如下 匹配一组节点在有利时使用更简单的构造来替换它们DAG合并遍优化SelectionDAG的结构。例如(add (Register X), (constant 0))可以折叠为(Register X)。类似的目标机器的合并方法可以识别节点模式决定是否合并以及折叠它们提升目标机器指令选择的质量。方法setTargetDAGCombine标记目标机器希望合并的节点。例如MIPS后端尝试合并加法——参考lib/Target/Mips/MipsISelLowering.cpp的setTargetDAGCombine(ISD::ADD)与performADDCombine()。 注在每个合法化阶段后运行DAG合并以尽量减少SelectionDAG冗余。另外DAG合并知道运行到遍链pass chain的何处例如在合法化或向量合法化之后并且可以更精确地使用这个信息。 类型合法化遍确保指令选择仅需要处理合法的类型。合法类型是目标机器原生支持的类型。例如在仅支持i32类型的目标机器上带有i64操作数的加法是非法的。在这个情形里类型合法器执行整数扩展将一个i64操作数分解为两个i32操作数同时生成处理它们的合适的代码。目标机器定义每个类型与哪些寄存器类相关明确声明支持的类型。因此必须相应地检测与处理非法类型标量类型可以被提升、扩展或者弱化而向量类型可以被分裂、标量化或者加宽。同样目标机器也可以定制类型合法化的方法。类型合法器运行两次在第一次DAG合并后以及向量合法化后。存在后端直接支持一个向量类型的情形这意味着对此有一个寄存器类但在一个给定向量类型上的一个特定操作不一定。例如有SSE2的X86支持v4i32向量类型。不过在ISD::OR上没有支持v4i32类型的X86指令仅支持v2i64。因此向量合法化器使用指令的合法类型提升或扩展来处理这些情形。在上述ISD::OR情形里操作被提升为使用v2i64类型。 注对某些类型扩展将消除向量类型使用标量类型。这会导致目标机器不支持的标量类型。不过后续的类型合法化器将清除之。 DAG合法化器具有与向量合法化器相同的任务但处理任何带有不支持类型标量或向量的遗留操作。它支持相同的操作提升扩展处理定制节点。例如x86节点不支持以下三个中的任意一个i8类型有符号整数到浮点数的操作ISD::SINT_TO_FP要求合法化器提升该操作i32操作数上的有符号除法要求一个扩展发布一个库调用来处理该除法f32操作数上浮点绝对值ISD::FABS使用一个定制句柄来生成具有相同效果的代码。X86以下列方式来发布这样的行为参考lib/Target/X86/X86ISelLowering.cpp setOperationAction(ISD::SINT_TO_FP, MVT::i8, Promote); setOperationAction(ISD::SDIV, MVT::i32, Expand); setOperationAction(ISD::FABS, MVT::f32, Custom);  4.1.5. DAG到DAG的指令选择 DAG到DAG指令选择的目的是通过模式匹配将目标机器无关的节点翻译为目标机器特定的节点。指令选择算法是局部的一次作用在一个SelectionDAG基本块实例上。 作为一个例子在指令选择后我们的SelectionDAG结构展示如下。CopyToRegCopyFromReg及Register节点没有触及并一直维持到寄存器分配。事实上指令选择阶段甚至可能生成额外的节点。在指令选择后 ISD::ADD节点被翻译为X86指令ADD32ri8而X86ISD::RET_FLAG被翻译为RET。 注在同一个DAG中可能有3种指令表示共存通用LLVM ISD节点比如ISD::ADD目标机器特定的TargetISD节点比如X86ISD::RET_FLAG以及目标机器的物理指令比如X86::ADD32ri8。 4.1.6. 模式匹配 每个目标机器通过在名为Target_NameDAGToDAGISel的SelectionDAGISel子类中实现Select()方法来处理指令选择例如SPARC中的SparcDAGToDAGISel::Select()。这个方法接受一个要匹配的SDNode参数返回代表一条物理指令的一个SDNode值否则出错。 Select()方法允许两个方式来匹配物理指令。最直接的方式是通过调用从TableGen模式生成的匹配代码就像下面列表中的第一步。不过模式表达能力可能不足以处理某些指令的古怪行为。在这种情形下必须在这个方法里编写定制的C匹配逻辑的实现就像下面列表的第二步。这个做法的细节如下 1. Select()方法调用SelectCode。TableGen为每个目标机器生成SelectCode()方法在这个代码里TableGen还生成了MatcherTable将ISD及TargetISD节点映射到物理指令节点。这个匹配者表从.td文件通常是TargetInstrInfo.td里的指令定义生成。SelectCode()方法以调用使用该目标机器匹配者表来匹配节点的目标机器无关方法SelectCodeCommon()结束。TableGen有一个专用的指令选择后端来生成这些方法即这个表 $ cd llvm_source/lib/Target/Sparc $ llvm-tblgen -gen-dag-isel Sparc.td -I ../../../include 对每个目标机器在C生成文件build_dir/lib/Target/Target/TargetGenDAGISel.inc中有相同的输出例如SPARC的方法与表在build_dir/lib/Target/Sparc/SparcGenDAGISel.inc文件里。 2. 在调用SelectCode()之前提供定制的匹配代码。例如i32节点ISD::MULHU执行两个i32的乘法产生一个i64结果并返回高i32部分。在32位SPARC里乘法指令SP::UMULrr在特殊寄存器Y中返回高部分这要求使用SP::RDY指令读出。TableGen不能体现这个逻辑我们使用下述代码来解决之 case ISD::MULHU: { SDValue MulLHS N-getOperand(0); SDValue MulRHS N-getOperand(1); SDNode *Mul CurDAG-getMachineNode(SP::UMULrr, dl, MVT::i32, MVT::Glue, MulLHS, MulRHS); return CurDAG-SelectNodeTo(N, SP::RDY, MVT::i32, SDValue(Mul, 1)); } 这里在这个上下文中N是要匹配的SDNode实参它等于ISD::MULHU。因为在这个case语句之前已经执行过完备性检查我们着手生成SPARC特定的操作码来替换ISD::MULHU。为此我们调用CurDAG-getMachineNode()创建一个带有物理指令SP::UMULrr的节点。其次通过使用CurDAG- SelectNodeTo()我们创建一个SP::RDY指令节点然后将所有使用ISD::MULHU节点的地方改为指向SP::RDY的结果。下图展示了这个例子指令选择前后SelectionDAG结构。上述的C代码片段是lib/Target/Sparc/SparcISelDAGToDAG.cpp代码的简化版。 4.1.7. 指令选择过程的可视化 有几个llc选项允许在指令选择的不同阶段可视化SelectionDAG。如果你使用这些选项llc将生成一个类似于之前展示图的.dot图不过你需要使用dot程序来显示它或使用dotty来编辑它两者都能在www.graphviz.org的Graphviz包里找到。下表以执行序展示了各个选项 Llc选项 阶段 -view-dag-combine1-dags 在DAG合并1之前 -view-legalize-types-dags 在类型合法化之前 -view-dag-combine-lt-dags 类型合法化2之后DAG合并之前 -view-legalize-dags 合法化之前 -view-dag-combine2-dags DAG合并2之前 -view-isel-dags 在指令选择之前 -view-sched-dags 指令选择之后调度之前 44.1.8. 快速指令选择 LLVM还支持另一个称为快速指令选择的实现。快速指令选择的目的是以代码质量为代价提供快速的代码生成它适合于-O0级别优化过程的哲学。速度提升归因于避免复杂的折叠与降级逻辑。TableGen描述也用于简单的操作但指令更复杂的匹配要求目标机器特定的处理代码。 -O0过程还使用快速的次优寄存器分配器及调度器以代码质量换取编译速度。
http://www.w-s-a.com/news/776513/

相关文章:

  • 众筹网站平台建设工信部网站备案系统
  • 网站301重定向代码wordpress 加子目录
  • 淄博网站制作优化推广asp做学生信息网站
  • 海口招商建设有限公司网站淮安哪有专业做网站的公司
  • 喀什哪有做网站的国内正规seo网络推广
  • 网站设计初步规划公司网页打不开是什么原因
  • 深圳企业网站建设推广服务php做的商城网站设计论文
  • 韩雪冬网站手机网站开发 宽度
  • 奉贤专业做网站新手怎么做企业网站
  • 做网站用哪几个端口 比较好手机号网站源码
  • 手机免费代理ip网站那个旅游网站做攻略最好
  • 西安做网站找哪家公司好苏州专业网站建设开发
  • dedecms如何做网站网站设计实施方案
  • 网站建设合约品牌设计有哪些
  • 织梦企业门户网站宝塔搭建wordpress网站
  • 网站为什么没有排名了11月将现新冠感染高峰
  • 网站开发维护专员岗位职责辽阳企业网站建设
  • 做外国订单有什么网站网站设计论文提纲
  • 商城网站建设报价方案导师让做网站
  • 清远市企业网站seo联系方式动易官方网站
  • 手机上怎么做能打开的网站一级域名和二级域名跨域
  • 网站首页效果图wordpress 在线教育
  • 电商网站开发团队广西桂林商贸旅游技工学校
  • 网站模板文件怎么下载东莞常平镇邮政编码
  • 建网站需要什么wordpress误删的后果
  • wordpress无插件实现网站地图做阿里巴巴网站店铺装修费用
  • 英文互动网站建设南宁住房和城乡建设局网站
  • 威海微网站建设乐清建网站哪家强
  • 网站和app的开发成本saas系统开发教程
  • ps切片工具做网站大气简洁网站