llvm后端之td定义指令信息
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
相关文章:
llvm后端之td定义指令信息
llvm后端之td定义指令信息 引言1 定义指令2 定义Operand3 定义SDNode4 PatFrags4.1 ImmLeaf4.2 PatLeaf 5 ComplexPattern6 谓词条件7 理解dag 引言 llvm后端通过td定义指令信息,并通过dag匹配将IR节点转换为平台相关的指令。 1 定义指令 td通过class Instructio…...
战地机房集装箱数据中心可视化:实时监控与管理
通过图扑可视化技术实时监控战地机房集装箱数据中心的各项运行指标和环境参数,提高部署效率和设备管理能力,确保数据中心稳定运行。...
Linux入门攻坚——31、rpc概念及nfs和samba
NFS:Network File System 传统意义上,文件系统在内核中实现 RPC:函数调用(远程主机上的函数),Remote Procedure Call protocol 一部分功能由本地程序完成 另一部分功能由远程主机上的 NFS本质…...
内网穿透的应用-本地化部署Elasticsearch平替工具OpenObserve并实现无公网IP远程分析数据
文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动OpenObserve容器4. 本地访问测试5. 公网访问本地部署的OpenObserve5.1 内网穿透工具安装5.2 创建公网地址 6. 配置固定公网地址 前言 本文主要介绍如何在Linux系统使用Docker快速本地化部署OpenObserve云原生可…...
哈希表 and 算法
哈希表: 哈希表(Hash table),也被称为散列表,是一种根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射…...
Comsol 共用声固耦合边界与热粘性声学边界的亥姆霍兹腔体超材料板精准隔声设计
声子晶体可分为局域共振型声子晶体和布拉格散射型声子晶体, 由于布拉格声子晶体需要的结构尺寸往往很大, 不便于实际应用; 而基于局域共振型机理的声子晶体能够实现“小体积控制大波长”, 因而有更加广泛的应用, 其中利用Helmholtz共鸣腔是局域共振型机理的典型应用, 近年来, H…...
Linux系统本地化部署Dify并安装Ollama运行llava大语言模型详细教程
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
极光出席深圳国际人工智能展并荣获“最具投资价值人工智能奖”
9月8-10日,由深圳市工业和信息化局、深圳市发展和改革委员会、深圳市科技创新局、深圳市政务服务和数据管理局、深圳市中小企业服务局共同指导,深圳市人工智能行业协会主办的第五届深圳国际人工智能展正式开幕。作为中国领先的客户互动和营销科技服务商&…...
人工智能领域的性能指的是什么
目录 1. 准确性(Accuracy) 2. 精确率与召回率(Precision & Recall) 3. F1分数 4. 运行时间与延迟(Latency) 5. 吞吐量(Throughput) 6. 可扩展性(Scalability&a…...
SQL进阶技巧:如何利用SQL解决趣味赛马问题?| 非等值关联匹配问题
目录 0 问题描述 1 数据准备 2 问题分析 方法一:先分后合思想 方法2:非等值关联匹配 3 小结 0 问题描述 有一张赛马记录表,如下所示: create table RacingResults ( trace_id char(3) not null,race_date date not null, race_nbr int not null,win_name char(30) n…...
Vue Echarts报错Initialize failed: invalid dom解决方法
此问题是图表初始化时 找不到dom,以下是解决方法 1、不要用created(用mounted),created这时候还只是创建了实例,但模板还没挂载完成; created: 在模板渲染成 html 前调用,通常初始…...
MySQL—死锁
什么是死锁? 好比是两个事务都在等待对方释放锁,之后进行下一步操作,但是最后双方都没有释放资源,所以导致一直处于等待的状态。 但是服务器不会让死锁的状态一直持续,会关闭其中一个影响较小的事务(右边的…...
CS5363|CS5263升级方案|DP转HDMI 4K60HZ芯片方案
CS5363是一种高度集成的单芯片,适用于多个细分市场和显示应用,如Typec扩展、手机/电脑投屏、扩展底座、投影仪等。 CS5363管脚分布情况如下: CS5363是一款高度集成的单芯片,适用于多个mGeneral 支持最高分辨率/定时4k60Hz 支持…...
Git Lab 项目迁移到gitee 并且包含提交记录
步骤 1: 准备工作 1.安装Git:确保你在本地计算机上安装了Git。如果尚未安装,可以从Git官网下载并安装。 2.创建Gitee账号:如果你还没有Gitee账号,请先注册一个,访问Gitee官网进行注册。 3.创建新的Gitee仓库࿱…...
如何用用智能码二维码zhinengma.cn做空调机房巡检
用智能码二维码做空调机房巡检 引言 空调机房是保障建筑物内环境舒适度的关键设施,其巡检工作对于确保空调系统的稳定运行至关重要。通过引入智能码二维码技术,可以大大提高空调机房巡检的效率和准确性。 一、二维码在空调机房巡检中的应用 1.1 巡检…...
如何与客户保持高度粘性?这个系统给您答案
客户粘性是企业成功的关键因素之一,企客宝企微版在打通获客、转化、运营全链路方面发挥着重要作用,实现客户粘性的提升。 前言 客户粘性是企业成功的关键因素之一。企业需要不断通过各种手段提升客户粘性,保持客户忠诚度和长期合作关系。企客…...
算法知识点————两个栈实现一个队列
思路:当队列入队的时候,将元素入栈(instack),当队列出栈的时候,先判断栈(outstack)是否为空,如果为空,则将栈(instack)的元素全部放入…...
并行程序设计基础——并行I/O(1)
目录 一、概述 1、按照读写定位分类 2、按照同步机制分类 3、按照参加读写操作的进程的限制分类 二、并行文件管理的基本操作 1、MPI_FILE_OPNE 2、MPI_FILE_CLOSE 3、MPI_FILE_DELETE 4、MPI_FILE_SET_SIZE 5、MPI_FILE_PREALLOCATE 6、MPI_FILE_GET_SIZE 7、MPI_…...
在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲
1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance this;this.data []…...
JVM系列(十) -垃圾收集器介绍
一、摘要 在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。 今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。 二、垃圾收集器 如果说收集算法是内存回收的方法论,那么…...
ALPEC框架:革新睡眠觉醒事件检测的评估范式
1. 项目概述:从“数点”到“看事件”的评估范式革新在睡眠医学的日常工作中,分析一整夜的多导睡眠图(PSG)数据,手动标记出每一次短暂的睡眠觉醒事件,是一项极其耗时且对专家经验依赖度极高的工作。一个典型…...
软考软件设计师每日备考资料 2026年5月16日(周六) | 距考试仅剩7天(5月23-26日)**
📚 软考软件设计师每日备考资料📅 2026年5月16日(周六) | 距考试仅剩7天(5月23-26日) 🎯 今日主题:考前7天全真模拟卷 答题节奏训练 新考纲AI终极速记 考前一周冲刺计划一、&…...
【2026年阿里巴巴集团暑期实习- 5月23日-算法岗-第一题- 荆棘林的最优砍断计划】(题目+思路+JavaC++Python解析+在线测试)
题目内容 林中共有 n n n 株荆棘,第 i i i 株的坚硬度为 a i a_i...
机器学习优化算法在激光等离子体加速实验中的应用与选型指南
1. 项目概述:当机器学习算法遇见激光等离子体加速在激光等离子体加速(Laser Wakefield Acceleration, LWFA)这类前沿物理实验中,我们常常面临一个经典难题:如何从一堆相互耦合、影响复杂的实验参数中,快速、…...
神经网络辅助可变形匹配滤波器在光通信中的应用
1. 神经网络辅助可变形匹配滤波器技术解析在光通信系统中,匹配滤波器作为信号检测的关键组件,其性能直接影响整个通信链路的可靠性。传统固定匹配滤波器基于理想信道假设设计,当面对实际系统中的带宽限制、大气湍流等复杂信道条件时ÿ…...
分布式系统测试:验证分布式系统的正确性和性能
分布式系统测试:验证分布式系统的正确性和性能 一、分布式系统测试概述 1.1 分布式系统测试的定义 分布式系统测试是指对分布式系统进行验证和评估的过程,包括功能测试、性能测试、可靠性测试和安全性测试等方面。它确保分布式系统在各种场景下都能正确、…...
终极指南:如何免费快速上手Method Draw在线SVG编辑器
终极指南:如何免费快速上手Method Draw在线SVG编辑器 【免费下载链接】Method-Draw Method Draw, the SVG Editor for Method of Action 项目地址: https://gitcode.com/gh_mirrors/me/Method-Draw 如果你正在寻找一款简单高效的在线SVG编辑器,那…...
为什么92%的Lindy自动化项目在第90天遭遇断崖式停滞?资深架构师紧急披露3个临界预警信号
更多请点击: https://intelliparadigm.com 第一章:为什么92%的Lindy自动化项目在第90天遭遇断崖式停滞?资深架构师紧急披露3个临界预警信号 当Lindy自动化项目运行至第90天左右,系统吞吐量骤降40%、任务积压率突破68%、人工干预频…...
无授权不感知、无穿戴可溯源:无感定位重构公安新型治安底座
无授权不感知、无穿戴可溯源:无感定位重构公安新型治安底座镜像视界浙江科技有限公司依托国家十四五重点课题研究成果、镜像视界浙江普陀时空大数据应用技术联合研究院联合研发体系与河南省电检院权威认证资质,以自研空间计算技术为根基打磨无感定位体系…...
微信小程序逆向工程深度解析:wxappUnpacker实用指南
微信小程序逆向工程深度解析:wxappUnpacker实用指南 【免费下载链接】wxappUnpacker forked from https://github.com/qwerty472123/wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 微信小程序逆向工程是移动应用安全研究的重…...
