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

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定义指令信息&#xff0c;并通过dag匹配将IR节点转换为平台相关的指令。 1 定义指令 td通过class Instructio…...

战地机房集装箱数据中心可视化:实时监控与管理

通过图扑可视化技术实时监控战地机房集装箱数据中心的各项运行指标和环境参数&#xff0c;提高部署效率和设备管理能力&#xff0c;确保数据中心稳定运行。...

Linux入门攻坚——31、rpc概念及nfs和samba

NFS&#xff1a;Network File System 传统意义上&#xff0c;文件系统在内核中实现 RPC&#xff1a;函数调用&#xff08;远程主机上的函数&#xff09;&#xff0c;Remote Procedure Call protocol 一部分功能由本地程序完成 另一部分功能由远程主机上的 NFS本质…...

内网穿透的应用-本地化部署Elasticsearch平替工具OpenObserve并实现无公网IP远程分析数据

文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动OpenObserve容器4. 本地访问测试5. 公网访问本地部署的OpenObserve5.1 内网穿透工具安装5.2 创建公网地址 6. 配置固定公网地址 前言 本文主要介绍如何在Linux系统使用Docker快速本地化部署OpenObserve云原生可…...

哈希表 and 算法

哈希表&#xff1a; 哈希表&#xff08;Hash table&#xff09;&#xff0c;也被称为散列表&#xff0c;是一种根据关键码值&#xff08;Key value&#xff09;而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。这个映射…...

Comsol 共用声固耦合边界与热粘性声学边界的亥姆霍兹腔体超材料板精准隔声设计

声子晶体可分为局域共振型声子晶体和布拉格散射型声子晶体, 由于布拉格声子晶体需要的结构尺寸往往很大, 不便于实际应用; 而基于局域共振型机理的声子晶体能够实现“小体积控制大波长”, 因而有更加广泛的应用, 其中利用Helmholtz共鸣腔是局域共振型机理的典型应用, 近年来, H…...

Linux系统本地化部署Dify并安装Ollama运行llava大语言模型详细教程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

极光出席深圳国际人工智能展并荣获“最具投资价值人工智能奖”

9月8-10日&#xff0c;由深圳市工业和信息化局、深圳市发展和改革委员会、深圳市科技创新局、深圳市政务服务和数据管理局、深圳市中小企业服务局共同指导&#xff0c;深圳市人工智能行业协会主办的第五届深圳国际人工智能展正式开幕。作为中国领先的客户互动和营销科技服务商&…...

人工智能领域的性能指的是什么

目录 1. 准确性&#xff08;Accuracy&#xff09; 2. 精确率与召回率&#xff08;Precision & Recall&#xff09; 3. F1分数 4. 运行时间与延迟&#xff08;Latency&#xff09; 5. 吞吐量&#xff08;Throughput&#xff09; 6. 可扩展性&#xff08;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&#xff0c;以下是解决方法 1、不要用created&#xff08;用mounted&#xff09;&#xff0c;created这时候还只是创建了实例&#xff0c;但模板还没挂载完成&#xff1b; created&#xff1a; 在模板渲染成 html 前调用&#xff0c;通常初始…...

MySQL—死锁

什么是死锁&#xff1f; 好比是两个事务都在等待对方释放锁&#xff0c;之后进行下一步操作&#xff0c;但是最后双方都没有释放资源&#xff0c;所以导致一直处于等待的状态。 但是服务器不会让死锁的状态一直持续&#xff0c;会关闭其中一个影响较小的事务&#xff08;右边的…...

CS5363|CS5263升级方案|DP转HDMI 4K60HZ芯片方案

CS5363是一种高度集成的单芯片&#xff0c;适用于多个细分市场和显示应用&#xff0c;如Typec扩展、手机/电脑投屏、扩展底座、投影仪等。 CS5363管脚分布情况如下&#xff1a; CS5363是一款高度集成的单芯片&#xff0c;适用于多个mGeneral 支持最高分辨率/定时4k60Hz 支持…...

Git Lab 项目迁移到gitee 并且包含提交记录

步骤 1: 准备工作 1.安装Git&#xff1a;确保你在本地计算机上安装了Git。如果尚未安装&#xff0c;可以从Git官网下载并安装。 2.创建Gitee账号&#xff1a;如果你还没有Gitee账号&#xff0c;请先注册一个&#xff0c;访问Gitee官网进行注册。 3.创建新的Gitee仓库&#xff1…...

如何用用智能码二维码zhinengma.cn做空调机房巡检

用智能码二维码做空调机房巡检 引言 空调机房是保障建筑物内环境舒适度的关键设施&#xff0c;其巡检工作对于确保空调系统的稳定运行至关重要。通过引入智能码二维码技术&#xff0c;可以大大提高空调机房巡检的效率和准确性。 一、二维码在空调机房巡检中的应用 1.1 巡检…...

如何与客户保持高度粘性?这个系统给您答案

客户粘性是企业成功的关键因素之一&#xff0c;企客宝企微版在打通获客、转化、运营全链路方面发挥着重要作用&#xff0c;实现客户粘性的提升。 前言 客户粘性是企业成功的关键因素之一。企业需要不断通过各种手段提升客户粘性&#xff0c;保持客户忠诚度和长期合作关系。企客…...

算法知识点————两个栈实现一个队列

思路&#xff1a;当队列入队的时候&#xff0c;将元素入栈&#xff08;instack&#xff09;&#xff0c;当队列出栈的时候&#xff0c;先判断栈&#xff08;outstack&#xff09;是否为空&#xff0c;如果为空&#xff0c;则将栈&#xff08;instack&#xff09;的元素全部放入…...

并行程序设计基础——并行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. 单例模式&#xff08;Singleton Pattern&#xff09; 确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 示例代码&#xff1a; class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance this;this.data []…...

JVM系列(十) -垃圾收集器介绍

一、摘要 在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。 今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。 二、垃圾收集器 如果说收集算法是内存回收的方法论,那么…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...